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

Gre*_*att 7 gnu seq

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

1234567890123456789
Run Code Online (Sandbox Code Playgroud)

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

seq -s '' 1 9 ; echo -n 0; seq -s '' 1 9
Run Code Online (Sandbox Code Playgroud)

但是, seq 在每次运行后都会输出一个换行符。我怎样才能避免这种情况?

ter*_*don 10

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

$ printf "%s" $(seq 1 9) $(seq 0 9)
1234567890123456789$
Run Code Online (Sandbox Code Playgroud)

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

$ printf "%s" $(seq 1 9) $(seq 0 9) $'\n'
1234567890123456789
$
Run Code Online (Sandbox Code Playgroud)

如果您不需要使用一些更简单的选择seq

$ perl -le 'print 1..9,0,1..9'
1234567890123456789
$ printf "%s" {1..9} {0..9} $'\n'
1234567890123456789
Run Code Online (Sandbox Code Playgroud)

既然你提到的可移植性,我建议你使用perl的方法,或者如果你很可能会遇到系统没有perl,然而需要同样的命令,在运行炮弹包括bashshdashtcsh等,试图卡米尔的做法

  • @GreenMatt 当然,如果你需要便携性,你也应该[避免使用 `echo`](https://unix.stackexchange.com/a/65819/22222)。 (3认同)
  • @GreenMatt 哈哈。说出你喜欢 Perl 的地方,你就是无法在文本处理方面打败它,而且它非常便携。 (2认同)

Kam*_*ski 6

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

(seq -s '' 1 9 ; echo -n 0; seq -s '' 1 9) | tr -d '\n'
Run Code Online (Sandbox Code Playgroud)

虽然其他答案可能专注于修改您的原始方法,但这种方法应该只删除换行符,而不管之前是什么|


ilk*_*chu 5

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

在 Bash 中,你可以使用这样的东西(对于 19 长的序列):

for ((i=1; i <= 19; i++)); do printf "%d" "$(( i % 10 ))"; done; echo
Run Code Online (Sandbox Code Playgroud)

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

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