Bir giriş dizesinin n katı olan bir dizgenin çıktısını almayı sağlayan herhangi bir yerleşik Linux komutu var mı?
Bir giriş dizesinin n katı olan bir dizgenin çıktısını almayı sağlayan herhangi bir yerleşik Linux komutu var mı?
Yanıtlar:
adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
printfdefalarca ücretsiz biçim dizesi, "döngü" aşırı argümanlar uygulanacak olmasıdır. "Aşırı" derken, %yer tutuculardan daha fazla argüman olduğunu kastediyorum .
İşte oldukça taşınabilir bir eski moda yolu:
yes "HelloWorld" | head -n 10
Bu, Adrian Petrescu'nun ayraç genişlemesini kullanarak yanıtının daha geleneksel bir sürümüdür :
for i in {1..5}
do
echo "HelloWorld"
done
Bu eşdeğerdir:
for i in 1 2 3 4 5
Bu, pike'nin cevabının biraz daha özlü ve dinamik bir versiyonudur :
printf -v spaces '%*s' 10 ''; printf '%s\n' ${spaces// /ten}
sed -n 'H;${x;s/\n//gp}'veya sed -n ':t;${s/\n//gp};N;bt'diğerlerini yönlendirmek, echo $(yes "HelloWorld" | head -n 10)dize her kopyası arasına bir boşluk ekleyen yapmaktır . Diğer bir yol da, boru tr -d '\n'hattını son boru hattını ortadan kaldıran boru hattıdır.
yesBen (kimin çıktı dalgalandığı) bir komut çoğaltmak istedik çünkü çözüm, tam olarak ne ihtiyaç vardı. Böylece:yes "$(my-command)" | head -n 2
Bu parametrelendirilebilir ve geçici bir değişken gerektirmez, FWIW:
printf "%${N}s" | sed 's/ /blah/g'
Veya $Nbir bash dizisinin büyüklüğü ise:
echo ${ARR[@]/*/blah}
printfformat belirticisine karıştırmamalısınız . Veriler format dizeleri içeriyorsa ne olur? Bu, "hassaslığı" (uzunluk) dinamik olarak belirtmenin doğru yoludur: printf '%*s' "$N"- değişken genişlemeyi önlemek için format dizesini tek tırnak içine almayı alışkanlık haline getirin.
Bahsedilen birkaç iyi yol. Eski güzel hakkında unutamam seq:
[john @ awesome] $ 'i 5 seklinde; yankı yapmak "Merhaba"; bitti Selam Selam Selam Selam Selam
{i..j}
Belki de sizin için daha genel ve kullanışlı başka bir yol:
adrian@Fourier:~$ n=5
adrian@Fourier:~$ for (( c=1; c<=n; c++)) ; do echo "HelloWorld" ; done
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
Beşinci kabuk, çoğu insanın düşündüğünden daha güçlüdür :)
yes, printf, for i in {1..5}) eğer nsıfır, boş dize döndürür nedeniyle karşılaştırma için matematiksel gösterime Ayrıca 1. durumunu mevcut olmadan, 1 telafi etmiş kolaydır (değiştirerek örneğin <=etmek <)
Bir numara kullanabilirsiniz. Boş bir değişkeni tekrarlamak hiçbir şey yazdırmaz. Böylece yazabilirsiniz:
echo word$wojek{1..100}
Eğer $wojek1 $wojek2... $wojek100mevcut olmayan değişkenler ise, sözünüzü başka bir şey olmadan 100 kez tekrar ettireceksiniz.
$_yerine kullanmak $wojekniyetini daha net gösterir.
Tekrarla n, sadece n-1aralarına virgül koy {}:
$ echo 'helloworld'{,,}
helloworld helloworld helloworld
İlk yankıdan sonra 'helloworld' i iki kez tekrarlar.
nbir değişkenden almak istersem ?
awk 'BEGIN {while (c++<4) printf "Hello"}'
Sonuç
Merhaba Merhaba Merhaba Merhaba
@pike'ın ima ettiği şeye dayanarak
string echo string'deki her karakter için
echo ${target//?/$replace}
=Karakterlerle altı çizili başlık örneği
export heading='ABCDEF';
export replace='=';
echo -e "${heading}\n${heading//?/$replace}"
çıkacak
ABCDEF
======
Bu Linux ve OS X arasındaki bağlantı gibi görünüyor ve bu beni mutlu ediyor.
Njoy!
BSD kullanıyorsanız, sadece kullanabilirsiniz seq.
$ seq -f "Hello, world" 5
Hello, world
Hello, world
Hello, world
Hello, world
Hello, world
seq (GNU coreutils) 8.25, bu seq: format 'Hello, world' has no % directive, bir formatlama direktifinin varlığını zorlayarak verir . GNU coreutils, örneğin birçok Linux dağıtımında ve Cygwin'de kullanılır. Buradaki bilgileri yalnızca BSD seq.
line="==========================="
line=${line:0:10}
${line//"="/"ten "}
çıktılar
ten ten ten ten ten ten ten ten ten ten
Perl'in xoperatörü gibi bir şey istediğinizi varsayalım , burada tekrarlamalar arasında otomatik olarak yeni bir satır alamazsınız:
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
Açıkça bir fordöngü kullandım çünkü {1..$n}bash yazamıyorsunuz : ayraç genişletme değişken değiştirmeden önce yapılır.
Tam olarak Linux'ta yerleşik değil, eğer yüklü python varsa ..
python
>>>var = "string"
>>>var*n
Ya da bir satırda, yorumcunun önerdiği gibi:
python -c 'print "This is a test.\n" * 10'
Bunu dene:
echo $(for i in $(seq 1 100); do printf "-"; done)
Yaratacağım (yüz tire):