grep 或 awk 在文件中查找多行模式(带空格)
grep or awk to find a multiline pattern (with spaces) in a file
我想检查 (true/false) 文件是否包含相当复杂的模式,其中包括空格并分布在超过 1 行。例如:
$ cat myfile
hello world
bye
两者都不工作:
awk '/\nhello world\nbye/' myfile
grep "\nhello world\nbye" myfile
我会建议
if grep -Pzq "\nhello wolrd\nbye" myfile; then
echo "Matched."
fi
-P
告诉 grep 使用 Perl 正则表达式(支持换行符),-q
抑制输出,-z
使用空字节作为行分隔符而不是换行符,这意味着文本文件将被视为一个长文件 "line."(二进制文件可能会被分成几个以空字节分隔的块,除非您的模式包含空字节,否则这应该不是问题)
使用 GNU awk 进行多字符 RS:
gawk -v RS='^$' '/\nhello world\nbye/' myfile
如果你可以使用 perl
这将有效:
perl -ln0e '/\nhello world\nbye/ && {print "true"} || {print "false"}' myfile
true
使用的开关:
-l
:在每个打印语句后打印一个新行
-n
:将循环输入
-0
:将使整个输入成为一条记录
-e
: 计算代码
我想检查 (true/false) 文件是否包含相当复杂的模式,其中包括空格并分布在超过 1 行。例如:
$ cat myfile
hello world
bye
两者都不工作:
awk '/\nhello world\nbye/' myfile
grep "\nhello world\nbye" myfile
我会建议
if grep -Pzq "\nhello wolrd\nbye" myfile; then
echo "Matched."
fi
-P
告诉 grep 使用 Perl 正则表达式(支持换行符),-q
抑制输出,-z
使用空字节作为行分隔符而不是换行符,这意味着文本文件将被视为一个长文件 "line."(二进制文件可能会被分成几个以空字节分隔的块,除非您的模式包含空字节,否则这应该不是问题)
使用 GNU awk 进行多字符 RS:
gawk -v RS='^$' '/\nhello world\nbye/' myfile
如果你可以使用 perl
这将有效:
perl -ln0e '/\nhello world\nbye/ && {print "true"} || {print "false"}' myfile
true
使用的开关:
-l
:在每个打印语句后打印一个新行
-n
:将循环输入
-0
:将使整个输入成为一条记录
-e
: 计算代码