4.10 对文件中的行、单词和字符进行迭代
编写不同的文本处理和文件操作脚本时,通常需要对文件中的字符、单词和行进行迭代。尽管这是一个很简单的操作,但是我们也会犯一些低级的错误,使所得的输出结果与期望的大相径庭。这则攻略将帮助你学习这方面的知识。
4.10.1 预备知识
将一个简单的循环用于迭代,再加上来自stdin
或文件的重定向,这就是对文件中的行、单词和字符进行迭代的基本方法。
4.10.2 实战演练
在这里,我们要讨论对行、单词和字符进行迭代时所需执行的三个步骤。让我们来看一看各个步骤是如何完成的。
- 迭代文件中的每一行
我们可以用一个while
循环从标准输入中读取,因此,它在每一次迭代中都会读取一行。
下面的方法可以将stdin
重定向到文件:
while read line;
do
echo $line;
done < file.txt
使用子shell的方法如下:
cat file.txt | ( while read line; do echo $line; done )
命令中的cat file.txt可以用任何命令序列的输出来替换。
- 迭代一行中的每一个单词
我们用一个while
循环迭代各行中的单词:
- for word in $line;
- do
- echo $word;
- done
- 迭代一个单词中的每一个字符
我们利用一个for
循环对变量 i 进行迭代,迭代范围从0到字符串的长度。在每次迭代中,可以用一个特殊的记法 ${string:start_position:No_of_characters}
从字符串中提取一个字符。
- for((i=0;i
- do
- echo ${word:i:1} ;
- done
4.10.3 工作原理
从文件中读取行或从行中读取单词,都是很直观的操作。不过,从单词中读取字符就需要点技巧了。为此,我们采用子串提取技术。
${word:start_position:no_of_characters}
返回变量word
所包含的字符串中的一个子串。
${#word}
返回变量word
的长度。
4.10.4 参考
1.14节讲解了Bash中不同类型的循环。
4.20节讲解了如何从字符串中提取字符。