我对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:.*?)定位已更改的行为,因此其他点仍然不匹配换行符。

10-06 10:31