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バイトの改行文字で構成される最後の引数が含ま
@{1..20}@1 @2 @3 ...ます。
$'\n'

答え2

zsh

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

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

もちろん、 を使用する必要はありませんprintfprintまたはを使用することもできます。これらはデフォルトでechoを追加します。 ( ではまたは と記述できますが、にバックスラッシュが含まれず で始まらない場合は、 /に簡略化できます)。\nprintf '%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 は各文字の表示幅を考慮します (上記の 2 倍幅文字のように (ブラウザーでは正確に 2 倍幅でレンダリングされない可能性がありますが、ターミナルではレンダリングされるはずです))。

print -rC1 --printf '%s\n'はまたは と似ておりprint -rl --、1 行に 1 つの要素を出力します。ただし、引数が渡されない場合 ( の場合などlines=()) は、空行ではなく何も出力されません。

答え3

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

答え4

1年以上前の元の投稿に対する解決策:

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

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

万が一、他の誰かが同じまたは類似の問題を抱えている場合に備えて。

関連情報