为了重复一个字符 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
以防其他人遇到相同或类似的问题。