我知道生成整数序列的命令seq
,每行一个,但我想问两个问题:
是否可以将序列的数字写在同一行中?
是否可以创建一个由空格分隔的数字序列组成的字符串?
答案1
与bash
,zsh
和 一起ksh93
,您可以使用{start..end..step} 大括号扩展形式:
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
答案2
GNUseq
采用分隔符 ( -s
) 选项:
$ seq -s ' ' 1 5
1 2 3 4 5
$ var="$(seq -s ' ' 1 5)"
$ echo "$var"
1 2 3 4 5
答案3
可移植到所有 shell 和任何具有 seq 的系统(因为这个问题已标记)
如果起始值为 1:
$ echo $(seq 10)
1 2 3 4 5 6 7 8 9 10
否则:
$ echo $(seq 5 10)
5 6 7 8 9 10
与BC:
$ echo $(echo "for (i=0;i<=1000;i++) i"| bc)
在bash中
echo {1..10}
笔记:
如果 IFS 的值包含换行符(默认情况下),则此 echo 解决方案有效。
默认情况下,IFS 设置为序列<空格><制表符><换行>。每次 shell 干净启动时都会重置。但是,如果您担心它在某些极端的极端情况下可能会发生变化,我们有几种解决方案。
在 bash、zsh、ksh 下只需使用:IFS=$' \t\n' (跳过此答案的所有其余部分)。
然而,在sh下重置IFS的值可能会很复杂在这里阅读完整的详细信息。
取消设置 IFS。
$ unset IFS; echo $(seq 5 10) #Always work.
永远会起作用。前提是下面没有需要设置 IFS 的代码(或子脚本),例如需要设置OldIFS="$IFS"
.
正确的解决方案。
用一个诡计对于 sh:
sh -c 'IFS="$(printf " \t\nx")"; IFS="${IFS%x}"; printf "$IFS"|xxd' # correct.
答案4
seq 10 |xargs
...或者...
seq 10 |paste -s -
上面的两个命令都会用空格分隔整数。xargs
默认为模仿/bin/echo
,因此每个整数均由一个空格分隔。不过,它的默认最大命令行长度为 128K。你可以调整这个...
seq 100000 | xargs -s2093009 | wc -l
...打印 1. 我这里的值-s
不是任意的 - 我在尝试更高的值后得到它(无论如何,这显然有效)但后来xargs
打印了有用的消息:
-s value should be <2093010
paste
是两个之一(据我所知)POSIX 认可的用于处理任意长度行的实用程序:
大多数标准实用程序都适用于文本文件。该
cut
实用程序可用于将任意行长度的文件转换为一组包含相同数据的文本文件。该paste
实用程序可用于创建(或重新创建)具有任意行长度的文件。包含组织成零行或多行的字符的文件。这些行不包含 NUL 字符,且不能超过
{LINE_MAX}
长度字节,包括\n
ewline 字符。虽然POSIX.1-2008不区分文本文件和二进制文件(参见ISO C标准),许多实用程序仅在操作文本文件时产生可预测或有意义的输出。具有此类限制的标准实用程序总是指定文本文件在他们的标准输入或者输入文件部分。
paste
默认为制表符分隔符,因此第二个命令后面的每个整数之间都会有一个制表符。你可以...
seq 10 |paste -sd ' ' -
...使用-d
elimiter 开关来改变该行为,