要创建列标题,如下所示:
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 中运行相同的命令,包括、 、bash
等sh
,请尝试dash
tcsh
卡米尔的方法。
答案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 版本的seq
when-s ''
指定不会在退出时产生换行符。