读取行并与模式匹配

读取行并与模式匹配

我无法弄清楚这一点。我需要查看文件中的每一行并检查它是否与变量中给出的单词匹配。

我从 command 开始read,但我不知道之后应该使用什么。我尝试过grep,但我可能用错了。

while read line; do 
  if [ $condition  ] ;then echo "ok" fi
done < file.txt

答案1

这是给您的快速介绍,我们正在做的就是

第 1 行:将文件读入变量时line

第 2 行:匹配正则表达式,$line如果匹配单词“bird”则回显该行。在此 if 语句中执行您需要的任何操作。

第 3 行:while 循环结束,在文件中进行管道传输foo.text

#!/bin/bash
while read line; do
  if [[ $line =~ bird ]] ; then echo $line; fi
done <foo.text

请注意,“bird”是一个正则表达式。这样您就可以将其替换为例如:bird.*word将同一行与正则表达式匹配。

尝试使用这样的文件,调用foo.text内容:

my dog is brown
her cat is white
the bird is the word

答案2

更简单的方法是使用grep(或egrep)。

grep bird file.txt

答案3

这是一个简单的脚本,它传递两个参数(文件名和变量)...下面还有一个硬编码版本。

#!/bin/bash

[ $# -lt 2 ] && echo "wrong number of args" && exit 1
file=$1
var=$2
while read line; do
    if  echo "$line" | grep -q "$var"; then echo "ok"; fi
done < "$file"
exit 0

[user@myserver ~]$ myscript file.txt some_text

或者,如果您更喜欢对文件(和变量)进行硬编码而不是作为参数传递......

while read line; do
    if  echo "$line" | grep -q "some_text"; then echo "ok"; fi
done < file.txt

答案4

sed另一种选择取决于您要对每行执行的处理。sed不过,如果您已经打算在每一行上使用,我只会推荐它。

sed -n '/regex/p' foo.text

我正在使用 sed 的-n选项来抑制正常输出。我使用该p命令仅打印匹配的行。

您也可以将其与编辑命令结合起来(我指的是处理)。

sed -n '/regex/{s/pattern/replacement/;p}' foo.text

如果您不想对每一行进行任何处理,那么我同意史蒂维猫的回答grep是最好的解决方案,是最干净、最快的。

grep regex foo.text

如果您想要进行需要额外 Unix 命令的处理,那么(并且只有这样)我才建议使用read.

相关内容