如何使用 while 循环逐行读取文件,并在每次迭代中将每一行 grep 与字符串进行比较?

如何使用 while 循环逐行读取文件,并在每次迭代中将每一行 grep 与字符串进行比较?

我有一个名为 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

相关内容