我对linux比较陌生,我想在一个以“leonard is”开头以“champion”结尾的文件中搜索一个模式
这个模式也可以放在多行中
输入文件(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以外的其他搜索方法有用,请告诉我谢谢!啊!
最佳答案
Perl拯救了:
perl -l -0777 -e 'print for <> =~ /(.*Leonard(?s:.*?)[Cc]hampion.*)/g' -- input.txt
-l
将换行符添加到打印-0777
读取整个文件,而不是逐行处理菱形运算符
<>
读取输入.*?
类似于.*
,即它匹配任何内容,但?
表示最短的匹配就足够了。这使得regex无法匹配第一个leonard和最后一个冠军之间的所有内容。正则表达式中的
.
通常与换行符不匹配,但它与s
修饰符匹配。(?s:.*?)
定位已更改的行为,因此其他点仍然不匹配换行符。