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 : 计算代码