Apakah ada perintah built-in Linux yang memungkinkan untuk mengeluarkan string yang n kali input string ??
Apakah ada perintah built-in Linux yang memungkinkan untuk mengeluarkan string yang n kali input string ??
Jawaban:
adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
printf
adalah bahwa hal itu berulang kali akan berlaku argumen kelebihan untuk format string, "looping" gratis. Dengan "kelebihan", maksud saya ada lebih banyak argumen daripada %
placeholder.
Berikut cara kuno yang cukup portabel:
yes "HelloWorld" | head -n 10
Ini adalah versi yang lebih konvensional dari jawaban Adrian Petrescu menggunakan brace expansion:
for i in {1..5}
do
echo "HelloWorld"
done
Itu setara dengan:
for i in 1 2 3 4 5
Ini adalah versi jawaban pike yang lebih ringkas dan dinamis :
printf -v spaces '%*s' 10 ''; printf '%s\n' ${spaces// /ten}
sed -n 'H;${x;s/\n//gp}'
atau yang sed -n ':t;${s/\n//gp};N;bt'
lain adalah dengan melakukan echo $(yes "HelloWorld" | head -n 10)
yang menambah ruang antara setiap salinan string. Namun cara lain adalah menyalurkan melalui tr -d '\n'
yang juga menghilangkan baris baru akhir.
yes
solusi adalah apa yang saya butuhkan, karena aku ingin menduplikasi perintah (yang output berfluktuasi). Jadi:yes "$(my-command)" | head -n 2
Ini dapat parameter dan tidak memerlukan variabel temp, FWIW:
printf "%${N}s" | sed 's/ /blah/g'
Atau, jika $N
ukuran array bash:
echo ${ARR[@]/*/blah}
seq
, yes
dan {1..5}
bukan POSIX 7.
printf
penentu format. Bagaimana jika data berisi string format? Ini adalah cara yang benar untuk secara dinamis menentukan "presisi" (panjang): printf '%*s' "$N"
- biasakan untuk melampirkan string format dalam tanda kutip tunggal untuk mencegah ekspansi variabel di sana.
Cukup banyak cara bagus yang telah disebutkan. Tidak bisa melupakan tua yang baik seq
:
[john @ mengagumkan] $ untuk saya di `seq 5`; lakukan gema "Hai"; selesai Hai Hai Hai Hai Hai
{i..j}
Triknya tidak pernah mengembalikan rentang kosong.)
Mungkin cara lain yang lebih umum dan bermanfaat bagi Anda:
adrian@Fourier:~$ n=5
adrian@Fourier:~$ for (( c=1; c<=n; c++)) ; do echo "HelloWorld" ; done
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
Shell bash lebih kuat dari yang dipikirkan kebanyakan orang :)
yes
, printf
, for i in {1..5}
) bahwa jika n
adalah nol, ia mengembalikan string kosong tanpa ada status 1. Juga karena notasi matematika untuk perbandingan, mudah telah diimbangi dengan 1 (misalnya dengan mengubah <=
ke <
)
Anda bisa menggunakan trik. Menggema variabel kosong tidak akan mencetak apa pun. Jadi, Anda dapat menulis:
echo word$wojek{1..100}
Jika $wojek1 $wojek2
... $wojek100
adalah variabel yang tidak ada, Anda akan mengulangi kata-kata Anda 100 kali tanpa hal lain.
$_
bukannya $wojek
memperjelas niat.
Ulangi n
kali, cukup beri n-1
koma di antara {}
:
$ echo 'helloworld'{,,}
helloworld helloworld helloworld
Ulangi 'helloworld' dua kali setelah gema pertama.
n
dari variabel?
awk 'BEGIN {while (c++<4) printf "Hello"}'
Hasil
Halo halo halo halo
berdasarkan apa yang @pike isyaratkan
untuk setiap karakter dalam string gema string
echo ${target//?/$replace}
Contoh tajuk yang digarisbawahi dengan =
karakter
export heading='ABCDEF';
export replace='=';
echo -e "${heading}\n${heading//?/$replace}"
akan menampilkan
ABCDEF
======
Ini sepertinya port antara linux dan OS X dan itu membuat saya senang.
nJoy!
Jika Anda menggunakan BSD, Anda bisa menggunakannya seq
.
$ seq -f "Hello, world" 5
Hello, world
Hello, world
Hello, world
Hello, world
Hello, world
seq (GNU coreutils) 8.25
, ini memberi seq: format 'Hello, world' has no % directive
, memaksa arahan pemformatan untuk hadir. GNU coreutils digunakan misalnya pada banyak distribusi Linux dan Cygwin. Termasuk info di sini untuk mereka yang kehilangan info bahwa itu hanya berfungsi di BSD seq.
line="==========================="
line=${line:0:10}
${line//"="/"ten "}
output
ten ten ten ten ten ten ten ten ten ten
Dengan asumsi Anda menginginkan sesuatu seperti x
operator Perl , di mana Anda tidak secara otomatis mendapatkan baris baru di antara pengulangan:
x() {
# usage: x string num
for i in $(seq 1 $2); do printf "%s" "$1"; done
# print a newline only if the string does not end in a newline
[[ "$1" == "${1%$'\n'}" ]] && echo ""
}
x Hi 10 # ==> HiHiHiHiHiHiHiHiHiHi
x $'Hello World!\n' 3
Saya secara eksplisit menggunakan for
loop karena Anda tidak dapat menulis {1..$n}
di bash: ekspansi brace dilakukan sebelum substitusi variabel.
Tidak persis built in ke linux, tetapi jika Anda memiliki python diinstal ..
python
>>>var = "string"
>>>var*n
Atau dalam satu baris, seperti yang disarankan komentator:
python -c 'print "This is a test.\n" * 10'
Coba yang ini:
echo $(for i in $(seq 1 100); do printf "-"; done)
Akan membuat (seratus dasbor):