Sed

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

  • January 23, 2022

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

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

輸出:

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

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

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

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

zsh

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

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

當然,您不必使用printf. 您也可以使用printor echohere\n預設添加 a 。(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'orprint -rl --每行列印一個元素,除非在沒有參數傳遞給它的情況下(例如 when lines=()),在這種情況下它什麼都不列印而不是空行)。

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

外殼首先擴展大括號,這稱為“大括號擴展”。

@{1..20}into@1 @2 @3 ...以此類推

然後將輸出每個參數的第一個字節,包括$'\n'由一個字節組成的最後一個參數 - 換行符

引用自:https://unix.stackexchange.com/questions/610946