如何将文本文件中的每个单独的整行存储到数组中?

如何将文本文件中的每个单独的整行存储到数组中?

我有一个名为“三词”的文件。它包含以下信息:

\#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

如果你有bash4

mapfile -t array < <(grep ^# threewords | cut -c2-)

将填充array,每个元素一行

printf "%s\n" "${array[@]}"
gray speedy bee
gray greedy pea

相关内容