我有一个名为 abc.txt 的文件,其内容如下:
1: It is a shell script
2: There are few lines in this file
3: I am good with programming in C, but beginner in shell
4: We are going towards end of file
5: END OF FILE
我想迭代地读取每个文件,并且在每次迭代中我想将该行与“我擅长使用 C 编程,但对 shell 却是初学者”进行比较,然后进行一些处理。
任何帮助都将不胜感激。谢谢!
答案1
使用 shell 循环是不必要的,因为grep
已经遍历了以下行:
grep '^[0-9]: I am good with programming in C, but beginner in shell' input.txt
如果有匹配的行,则会打印该行。[0-9]
定义将匹配的字符范围。我们还可以将其扩展到更长的数字[0-9]*:
(我认为使用 perl regex-P
选项可以做到这一点[0-9]+:
)。
如果确实需要 shell 循环,我们可以使用case
语句进行模式匹配
while IFS= read -r line; do
case $line in
*": I am good with programming in C") echo "Matched: $line";;
esac
done < input.xt
答案2
尝试这个示例代码来帮助识别和修改以满足您的需要:
#!/usr/bin/env bash
set -e
set -x
while read -r linenum line
do
if [ "$line" = "I am good with programming in C, but beginner in shell" ]
then
# Process things here
echo "same"
fi
done < "$1"
用法:
使可执行文件:
chmod +x script.sh
将脚本放在任意文件夹中,然后通过将文件传递给该脚本来运行脚本:
./script.sh /path/to/data.txt
信息:
-r
:传递给读取命令的选项可防止反斜杠转义被解释。set -e
:第一次出现错误时停止脚本的 Bash 选项。set -x
:用于调试 scrtip 的 Bash 选项。"$1"
:本例中传递给脚本的文件变量data.txt
linenum
:当 bash 将读取的行分成两个变量时,该变量保存行号,而另一个则通过变量传入lin
。