使用grep regex搜索多行模式

时间:2018-05-29 07:45:52

标签: linux awk sed grep

我对linux比较陌生我想在一个以&#34开头的文件中搜索模式; Leonard是"并以"冠军"

结束

此模式也可以放在多行

输入文件(input.txt)可能如下所示:

1 rabbit eats carrot Leonard is a champion 
2 loin is the king of 
3 jungle Leonard is a 
4 Champion 
5 Leonard is An exemplary 
6 Champion

我希望我的模式的所有出现都忽略输出文件中除模式之外的所有其他字符:

1 Leonard is a champion
3 Leonard is a
4 Champion
5 Leonard is An exemplary
6 Champion

我一直非常接近以下命令:

cat input.txt | grep -ioE "Leonard.*Champion$"

因此命令只返回

1 Leonard is a champion

忽略多行中出现的所有模式

如果除了grep以外的任何其他搜索方法都有用,请告诉我,谢谢!!

3 个答案:

答案 0 :(得分:1)

Perl救援:

perl -l -0777 -e 'print for <> =~ /(.*Leonard(?s:.*?)[Cc]hampion.*)/g' -- input.txt
  • -l为照片添加换行符
  • -0777读取整个文件,而不是逐行处理
  • 钻石运算符<>读取输入
  • .*?.*类似,即它匹配任何内容,但?表示最短的匹配就足够了。这可以防止正则表达式匹配第一个伦纳德和最后一个冠军之间的所有东西。
  • 正则表达式中的
  • .通常不会与换行符匹配,但它与s修饰符匹配。 (?s:.*?)本地化了已更改的行为,因此其他点仍然不匹配换行符。

答案 1 :(得分:0)

您正在寻找代表空白的\s+代表一个或多个

模式:Leonard is a\s+Champion

请参阅:https://regex101.com/r/qiNXhf/1

我在这个工具中使用了正则表达式的0知识,这对我帮助很大。请参阅右下角的注释,其中解释了所有这些标志。

enter image description here

答案 2 :(得分:0)

&#34;。&#34;引用为&#34;任何字符除了新行&#34;因此,您尝试实现的目标。是不可能的,我建议使用\ s添加*或+(如上所述),但需要了解如何使用&#34; grep&#34;来实现它。 reg表达。还有很好的正则表达式测试工具 - 例如https://regexr.com/