如何避免在 seq 完成时打印换行符?

如何避免在 seq 完成时打印换行符?

要创建列标题,如下所示:

1234567890123456789

我(正在尝试)使用 seq 和 echo:

seq -s '' 1 9 ; echo -n 0; seq -s '' 1 9

但是,seq 每次运行后都会输出一个换行符。我该如何避免这种情况?

答案1

假设你只想打印1234567890123456789,你可以这样做:

$ printf "%s" $(seq 1 9) $(seq 0 9)
1234567890123456789$

不过,根本不会有尾随换行符,所以也许您更喜欢:

$ printf "%s" $(seq 1 9) $(seq 0 9) $'\n'
1234567890123456789
$

如果你不这样做,有一些更简单的选择需要使用seq

$ perl -le 'print 1..9,0,1..9'
1234567890123456789
$ printf "%s" {1..9} {0..9} $'\n'
1234567890123456789

既然您提到了可移植性,我建议您使用该perl方法,或者如果您可能遇到没有 的系统perl,但需要在 shell 中运行相同的命令,包括、 、bashsh,请尝试dashtcsh卡米尔的方法

答案2

您可以使用从任何流中删除换行符tr -d '\n'。在你的情况下

(seq -s '' 1 9 ; echo -n 0; seq -s '' 1 9) | tr -d '\n'

虽然其他答案可能集中于修改您原来的方法,但这种方法应该只删除换行符,无论之前是什么|

答案3

我假设您不想要那个特定的字符串,而是具有可变长度的递增数字的字符串。为此,能够通过更改一个数字来更改宽度可能很有用,而不必通过多次调用来构建它seq

在 Bash 中,您可以使用类似这样的内容(对于 19 长的序列):

for ((i=1; i <= 19; i++)); do printf "%d" "$(( i % 10 ))"; done; echo

这应该在标准 shell 中工作(至少在 dash 和 busybox 中工作):

i=1; while [ "$i" -le 19 ]; do printf "%d" "$(( i % 10 ))"; i=$((i+1)); done; echo

答案4

使用时tr要摆脱尾随换行符,值得意识到它会删除全部-d其选项中给出的字符的出现次数。因此你可以让它更苗条:

(seq 1 9; echo 0; seq 1 9) | tr -d '\n'

——甚至echo不再需要了-n

为了完整起见:BSD 版本的seqwhen-s ''指定不会在退出时产生换行符。

相关内容