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:~$
printf
defalarca ü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.
yes
Ben (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 $N
bir bash dizisinin büyüklüğü ise:
echo ${ARR[@]/*/blah}
printf
format 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 n
sı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
... $wojek100
mevcut olmayan değişkenler ise, sözünüzü başka bir şey olmadan 100 kez tekrar ettireceksiniz.
$_
yerine kullanmak $wojek
niyetini daha net gösterir.
Tekrarla n
, sadece n-1
aralarına virgül koy {}
:
$ echo 'helloworld'{,,}
helloworld helloworld helloworld
İlk yankıdan sonra 'helloworld' i iki kez tekrarlar.
n
bir 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 x
operatö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 for
dö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):