如何从文件中读取单词(而不是行)?

man*_*t1k 12 bash

我已经读过这个关于如何使用bash从文本文件中读取n个字符的问题.我想知道如何从一个看起来像这样的文件一次读一个单词:

example text
example1 text1
example2 text2
example3 text3
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释一下,或者给我一个简单的例子吗?谢谢!

Tod*_*obs 17

使用标准输入执行此操作的方法是将-a标志传递给:

read -a words
echo "${words[@]}"
Run Code Online (Sandbox Code Playgroud)

这会将整行读入索引数组变量,在本例中为命名单词.然后,您可以对具有shell参数扩展的单词执行任何您喜欢的数组操作.

对于面向文件的操作,当前版本的Bash也支持内置的mapfile .例如:

mapfile < /etc/passwd
echo ${MAPFILE[0]}
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,阵列都是可行的方式.值得花些时间熟悉Bash数组语法,以充分利用此功能.


Som*_*ude 13

read默认情况下,该命令读取整行.因此,解决方案可能是读取整行,然后将其拆分为空格,例如for:

while read line; do
    for word in $line; do
        echo "word = '$word'"
    done
done
Run Code Online (Sandbox Code Playgroud)

  • 如果你的行包含 `*` 作为一个独立元素,你会从 `for word in $line` 得到当前目录中的文件名列表。(此外,不带 `-r` 的 `read` 会修改反斜杠字面量)。 (2认同)

Pau*_*ce. 8

通常,您应该使用while read -r line循环从文件中读取.要执行此操作并解析行上的单词,需要在for循环内嵌套while循环.

这是一种无需嵌套循环的技术:

for word in $(<inputfile)
do
    echo "$word"
done
Run Code Online (Sandbox Code Playgroud)


Cha*_*ffy 5

在给定的上下文中,单词数已知:

while read -r word1 word2 _; do
  echo "Read a line with word1 of $word1 and word2 of $word2"
done
Run Code Online (Sandbox Code Playgroud)

如果要将每行读入数组,read -a请将第一个单词放入数组的元素0,将第二个单词放入元素1,依此类推:

while read -r -a words; do
  echo "First word is ${words[0]}; second word is ${words[1]}"
  declare -p words # print the whole array
done
Run Code Online (Sandbox Code Playgroud)