我对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以外的任何其他搜索方法都有用,请告诉我,谢谢!!
答案 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知识,这对我帮助很大。请参阅右下角的注释,其中解释了所有这些标志。
答案 2 :(得分:0)
&#34;。&#34;引用为&#34;任何字符除了新行&#34;因此,您尝试实现的目标。是不可能的,我建议使用\ s添加*或+(如上所述),但需要了解如何使用&#34; grep&#34;来实现它。 reg表达。还有很好的正则表达式测试工具 - 例如https://regexr.com/。