我有一个名为“三词”的文件。它包含以下信息:
\#gray speedy bee
gr-A | sp-E-d-E | b-E
\#gray greedy pea
gr-A | gr-E-d-E | p-E
当我运行命令时:
cat threewords | grep ^# | cut -c2-
该命令拉出以 # 开头的两行。然后它删除 # 并将其作为输出返回:
gray speedy bee
gray greedy pea
当我运行命令时:
array=($(cat threewords | grep ^# | cut -c2-))
它创建数组,但将所有单词分隔到单独的数组位置,如下所示:
array[0] = gray,
array[1] = speedy,
array[2] = bee,
array[3] = gray,
array[4] = greedy,
array[5] = pea
我可以找出代码,使其将每行的输出放入数组中,如下所示:
array[0] = gray speedy bee,
array[1] = gray greedy pea
答案1
分割是用IFS
分隔符(默认包含空格、换行符和制表符)完成的。将 设为IFS
仅换行符:
$ IFS=$'\n' a=($(printf "1 2\n2 3\n"))
$ echo ${a[0]}
1 2
$ echo ${a[1]}
2 3
这将IFS
针对 shell 进行更改,因此最好先保存并恢复它:
OLD_IFS="$IFS"
IFS=$'\n' array=($(grep '^#' threewords | cut -c2-))
IFS="$OLD_IFS"
绝对没有理由这样做:
cat threewords | grep '^#'
grep
完全能够读取文件:
grep '^#' threewords
作为史蒂芬注意,当对命令的输出进行进一步的 shell 扩展时,应该使用以下命令禁用通配符set -f
:
$ help set
...
-f Disable file name generation (globbing).
否则:
$ cd /; a=( $(printf "*\n") )
$ echo ${a[@]}
bin boot cdrom dev etc home ...
答案2
如果你有bash
4
mapfile -t array < <(grep ^# threewords | cut -c2-)
将填充array
,每个元素一行
printf "%s\n" "${array[@]}"
gray speedy bee
gray greedy pea