使用 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

以防其他人遇到相同或类似的问题。

相关内容