使用 printf 重复一个字符并在末尾附加换行符

s.o*_*ene 8 sed printf

为了重复一个字符 N 次,我们可以使用printf. 例如,要重复@20 次,我们可以使用这样的方法:

N=20
printf '@%.0s' $(seq 1 $N)
Run Code Online (Sandbox Code Playgroud)

输出:

@@@@@@@@@@@@@@@@@@@@
Run Code Online (Sandbox Code Playgroud)

但是,该字符串的末尾没有换行符。我试过将输出管道传输到sed

printf '@%.0s' $(seq 1 $N) | sed '$s/$/\n/'
Run Code Online (Sandbox Code Playgroud)

是否可以printf在不使用 sed 的情况下通过单个(在输出末尾添加换行符)获得相同的结果?

nez*_*dka 13

printf %.1s @{1..20} $'\n'
Run Code Online (Sandbox Code Playgroud)

外壳首先扩展大括号,这称为“大括号扩展”。
@{1..20}into@1 @2 @3 ...等等
然后会输出每个参数的第一个字节,包括最后一个$'\n'由一个字节组成的参数——换行符

  • +1但值得一提的是它不可移植。它将在 Bash 和 Ksh 中工作。 (2认同)
  • @Quasimodo,那将是 ksh93、zsh、bash 和 mksh 的最新版本。`$'\n'` 语法来自 ksh93,`{1..20}` 语法来自 zsh。`%.1s` 在 zsh 中获得第一个 *character*,在其他 POSIX-like shell 中获得第一个 *byte*,但这应该没有区别,因为 `@` 通常是单字节的。请注意, `printf` 不是内置在 `mksh` 中的,因此它不会扩展到非常多的 `@`。 (2认同)

Sté*_*las 8

zsh

printf '%s\n' ${(l[20][@])}
Run Code Online (Sandbox Code Playgroud)

(使用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' '???????????')
$ print -rC1 -- ${(ml[$COLUMNS][@][ ])lines}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ short
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ longer text
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ???????????
$ print -rC1 -- ${(mr[$COLUMNS][@][ ])lines}
short @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
longer text @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
??????????? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Run Code Online (Sandbox Code Playgroud)

m标志导致 zsh 考虑每个字符的显示宽度(例如上面的那些双宽字符(您的浏览器可能不会以完全双宽呈现,但您的终端应该))。

print -rC1 --就像printf '%s\n'print -rl --每行打印一个元素,除非在没有参数传递给它的情况下(如 when lines=()),在这种情况下,它不打印任何内容而不是空行)。

  • 为什么只有zsh?,OP 没有说明。 (2认同)

ImH*_*ere 7

printf,以换行符结尾,可变大小,适用于破折号、ksh、bash 和 zsh:

$ printf '%*.0s\n' 33 "" | tr " " "@"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Run Code Online (Sandbox Code Playgroud)