使用 printf 重複一個字元並在末尾附加換行符

使用 printf 重複一個字元並在末尾附加換行符

為了重複一個字元 N 次,我們可以使用printf.例如,要重複@20 次,我們可以使用以下內容:

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

輸出:

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

但是,該字串末尾沒有換行符。我嘗試將輸出通過管道傳輸到sed

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

是否可以printf在不使用 sed 的情況下用單一(在輸出末尾添加換行符)獲得相同的結果?

答案1

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

shell 首先擴展大括號,稱為「大括號擴展」。
@{1..20}into@1 @2 @3 ...等等
然後會輸出每個參數的第一個位元組,包括最後一個$'\n'由一個位元組組成的參數-換行符

答案2

zsh

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

(使用l左填充參數擴展標誌。您也可以r在此處使用 ight 填充)。

當然,您不必使用printf.您也可以在此處使用print或 ,預設echo會新增 a \n。 (printf '%s\n' "$string"可以寫成print -r -- "$string"echo -E - "$string"in 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 --類似於printf '%s\n'print -rl --每行列印一個元素,除非沒有參數傳遞給它(例如 when lines=()),在這種情況下它不列印任何內容而不是空白行)。

答案3

我在腳本中使用它: printf '%150s\n' | tr ' ' '@'

答案4

一年多前的原始帖子的解決方案:

使用 printf 重複一個字元並在末尾附加換行符

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

以防其他人遇到相同或類似的問題。

相關內容