printfを使用して文字を繰り返し、最後に改行を追加します。

printfを使用して文字を繰り返し、最後に改行を追加します。

文字をN回繰り返すには、を使用できますprintf。たとえば、20回繰り返すには、@次のように使用できます。

N=20
printf '@%.0s' $(seq 1 $N)

出力:

@@@@@@@@@@@@@@@@@@@@

ただし、文字列の末尾に改行文字はありません。出力を次にパイピングしてみますsed

printf '@%.0s' $(seq 1 $N) | sed '$s/$/\n/'

printfsedを使用せずに単一(出力の末尾に改行を追加)で同じ結果を得ることはできますか?

答え1

printf %.1s @{1..20} $'\n'

シェルはまず中括弧を拡張し、これを「中括弧拡張」と呼びます。
@{1..20}into@1 @2 @3 ...など。その後、1バイト(改行文字)で構成される
最後のパラメータを含む各パラメータの最初のバイトが出力されます。$'\n'

答え2

そしてzsh

printf '%s\n' ${(l[20][@])}

l左パディングを使用するパラメータ拡張フラグ。ここでは軽いパディングを使用することもできますr.)

もちろん、使用する必要はありませんprintf。または、ここを使用するとprintデフォルトでecho追加されます\n。 (またはで書くことprintf '%s\n' "$string"ができますが、バックスラッシュを含まず、/で始まらない場合は/で単純化できます。)print -r -- "$string"echo -E - "$string"zsh$string-print "$string"echo "$string"

最終目標が画面の幅を埋める文字列のリストを表示することであれば、次のようにできます。

$ lines=(short 'longer text' 'even longer')
$ print -rC1 -- ${(ml[$COLUMNS][@][ ])lines}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ short
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ longer text
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ even longer
$ print -rC1 -- ${(mr[$COLUMNS][@][ ])lines}
short @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
longer text @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
even longer @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

このmフラグはzshが各文字の表示幅を考慮するようにします(例えば、上記の二重幅文字(ブラウザはそれを正確な二重幅としてレンダリングしないかもしれませんが、端末ではそうする必要があります))。

print -rC1 --引数が渡されていない場合(たとえば、when)を除いて、1行に1つの要素を印刷するか、類似しており、printf '%s\n'空白行ではなく何も印刷しません。print -rl --lines=()

答え3

私のスクリプトはこれを使用します。 printf '%150s\n' | tr ' ' '@'

答え4

1年前のオリジナルの投稿に対する解決策:

printfを使用して文字を繰り返し、最後に改行を追加します。

printf '@%.0s' $(seq 1 $N); echo

他の人が同じまたは類似の問題に直面した場合。

関連情報