4.10 对文件中的行、单词和字符进行迭代

编写不同的文本处理和文件操作脚本时,通常需要对文件中的字符、单词和行进行迭代。尽管这是一个很简单的操作,但是我们也会犯一些低级的错误,使所得的输出结果与期望的大相径庭。这则攻略将帮助你学习这方面的知识。

4.10.1 预备知识

将一个简单的循环用于迭代,再加上来自stdin或文件的重定向,这就是对文件中的行、单词和字符进行迭代的基本方法。

4.10.2 实战演练

在这里,我们要讨论对行、单词和字符进行迭代时所需执行的三个步骤。让我们来看一看各个步骤是如何完成的。

  • 迭代文件中的每一行

我们可以用一个while循环从标准输入中读取,因此,它在每一次迭代中都会读取一行。

下面的方法可以将stdin重定向到文件:

  1. while read line;
  2. do
  3. echo $line;
  4. done < file.txt

使用子shell的方法如下:

  1. cat file.txt | ( while read line; do echo $line; done )

命令中的cat file.txt可以用任何命令序列的输出来替换。

  • 迭代一行中的每一个单词

我们用一个while循环迭代各行中的单词:

  1. for word in $line;
  2. do
  3. echo $word;
  4. done
  • 迭代一个单词中的每一个字符

我们利用一个for循环对变量 i 进行迭代,迭代范围从0到字符串的长度。在每次迭代中,可以用一个特殊的记法 ${string:start_position:No_of_characters}从字符串中提取一个字符。

  1. for((i=0;i
  2. do
  3. echo ${word:i:1} ;
  4. done

4.10.3 工作原理

从文件中读取行或从行中读取单词,都是很直观的操作。不过,从单词中读取字符就需要点技巧了。为此,我们采用子串提取技术。

${word:start_position:no_of_characters} 返回变量word所包含的字符串中的一个子串。

${#word} 返回变量word的长度。

4.10.4 参考

  • 1.14节讲解了Bash中不同类型的循环。

  • 4.20节讲解了如何从字符串中提取字符。