Sed
使用 printf 重複一個字元並在末尾附加一個換行符
為了重複一個字元 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
. 您也可以使用echo
here\n
預設添加 a 。(printf '%s\n' "$string"
可以寫成print -r -- "$string"
或echo -E - "$string"
inzsh
,但如果$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 --
每行列印一個元素,除非在沒有參數傳遞給它的情況下(例如 whenlines=()
),在這種情況下它什麼都不列印而不是空行)。
printf %.1s @{1..20} $'\n'
外殼首先擴展大括號,這稱為“大括號擴展”。
@{1..20}
into@1 @2 @3 ...
以此類推然後將輸出每個參數的第一個字節,包括
$'\n'
由一個字節組成的最後一個參數 - 換行符