コンソール上で特定の文字列をワンライナーで指定回数リピートさせたい(例えば、0を10回リピート等)ということがあったので、備忘で残しておく。 いくつか方法があるようなので、それぞれ分けて残しておく。

1. ブレース展開を利用する

真っ先に利用する方法として思いつくのはブレース展開だと思う。 ただ、以下のように普通にechoにくっつけて利用すると展開時にはスペース区切りになってしまう。

echo 0{,,,,,}
blacknon@BS-PUB-UBUNTU-01:~$ echo 0{,,,,,}
0 0 0 0 0 0

一応、前にブレース展開の出力区切り文字を変更するのはやっているが、ちょっと長くなるし数字で繰り返し回数を指定できないので、あまりおすすめできないかも。

echo $(set '0'{,,,,,,,};IFS=;echo "$*")
blacknon@BS-PUB-UBUNTU-01:~$ echo $(set '0'{,,,,,};IFS=;echo "$*")
000000

2. printfを用いる

bashを使っているのであれば、以下のようにprintfを用いて文字列を繰り返し出力させることができる。

printf x"%.s" {1..n}
blacknon@BS-PUB-UBUNTU-01:~$ printf x"%.s" {1..11}|echo $(cat)
xxxxxxxxxxx
blacknon@BS-PUB-UBUNTU-01:~$ printf =-"%.s" {1..30}|echo $(cat)
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

これを利用して、以下のような事もできる。

blacknon@BS-PUB-UBUNTU-01:~$ seq 20 | xargs -I@ bash -c 'printf x"%.s" {1..@}|echo $(cat)'
x
xx
xxx
xxxx
xxxxx
xxxxxx
xxxxxxx
xxxxxxxx
xxxxxxxxx
xxxxxxxxxx
xxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxxxx
xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxx

もしくは、リピートする文字列が0なのであれば、printfの0埋めの仕組みを利用することで以下のように記述することも可能。 0以外の文字列をリピートしたい場合でも、sedで0を置換すればいい。

printf "%0*d\n" n
blacknon@BS-PUB-UBUNTU-01:~$ printf "%0*d\n" 30
000000000000000000000000000000
blacknon@BS-PUB-UBUNTU-01:~$ seq 20 | xargs -I@ printf 1"%0*d\n" @
10
100
1000
10000
100000
1000000
10000000
100000000
1000000000
10000000000
100000000000
1000000000000
10000000000000
100000000000000
1000000000000000
10000000000000000
100000000000000000
1000000000000000000
10000000000000000000
100000000000000000000

3. zshのrepeatを用いる

zshの場合、repeatコマンドというそのものなコマンドが用意されているので、これを利用するという方法もある。 bashでは利用できないので注意。

repeat n コマンド
BS-PUB-UBUNTU-01% repeat 12 printf x
xxxxxxxxxxxx

4. awk

awkの場合、forで繰り返し変数に結合させていく方法になる。

echo n|awk '{for(i=1;i<=$1;i++)x=x"s";print x}'
blacknon@BS-PUB-UBUNTU-01:~$ echo 10|awk '{for(i=1;i<=$1;i++)x=x"s";print x}'
ssssssssss

2017/11/12 追記

もしくは、以下のようにawk内でprintfを使う際、桁数の箇所に変数を差し込んで置換処理をしてやるといいだろう。

echo 10 | awk '{s=sprintf("%."$0"d","0");gsub(0,"-",s);print s}'
[root@BS-PUB-CENT7-01 ~]# echo 10 | awk '{s=sprintf("%."$0"d","0");gsub(0,"-",s);print s}'
----------

5. sed

sedの場合、ブレース展開と同じように数字では指定できず、以下のように&で繰り返しを指定する。

echo x | sed 's/./&&&&&&&&&&/g'
blacknon@BS-PUB-UBUNTU-01:~$ echo x | sed 's/./&&&&&&&&&&/g'
xxxxxxxxxx

6. perl

perlの場合だと、単純に文字列にリピート回数をかければいい。

perl -le 'print "str" x n'
blacknon@BS-PUB-UBUNTU-01:~$ perl -le 'print "ex"x10'
exexexexexexexexexex

7. ruby

rubyもperlと同様に、文字列にリピート回数をかけるだけだ。

ruby -e 'puts "say" * n'

8. python

pythonもperl、rubyと同様。

python -c 'print "str" * n'
blacknon@BS-PUB-UBUNTU-01:~$ python -c 'print "ouch!" * 15'
ouch!ouch!ouch!ouch!ouch!ouch!ouch!ouch!ouch!ouch!ouch!ouch!ouch!ouch!ouch!