获取以下文件:
aaa
bbb
XXX
ccc
ddd
eee
XXX
fff
ggg
我想打印所有行,pcregrep
直到第一行包含XXX
:
aaa
bbb
XXX
有可能(使用pcregrep
或pcre2grep
)吗?
我做到了:
$ pcre2grep -nM '(.|\n)*?XXX' file
1:aaa
bbb
XXX
4:ccc
ddd
eee
XXX
有没有办法在第一场比赛后退出?似乎pcre2grep
没有像has那样的--max-count
选项。grep
注意:我知道有更好的工具来获得所需的结果(sed
等等),但我不是在这里寻找替代解决方案。我的问题是关于pcregrep
or pcre2grep
,我想知道是否有办法模仿grep
的--max-count
选项。
当您使用 Debian 9 (Stretch) 时,您拥有的版本
pcre2-utils
包括pcre2grep
10.22。该版本不包括在一定数量的比赛后退出的-m
or选项。--max-count
话虽如此,您正在尝试做的事情,打印到一个字符串,对于您拥有的版本根本不可能。Debian 11 (Bullseye) 附带的版本 10.34 确实有这个选项。您可以在必须通过以下方式实现预期输出的文件上使用它:
您也可以使用正则来执行此操作,
grep
因为您的情况不需要使用 Perl 兼容的正则表达式:不需要该
-n
选项,因为它只是打印不在预期输出中的行号,并且该-M
选项与该选项冲突,-m
因为前者告诉它匹配多行。上述命令的输出:
这会打印到字符串的第一个匹配项
XXX
以及它之前的两行;但是,我不建议这样做,因为您必须确切知道从行首到字符串出现了多少行。对于您的特定文件,这可能不是问题,但如果文件包含数千或数百万行,则可能是问题。实际上,您尝试做的是打印从文件开头到并包括某个字符串的所有内容。
grep
两者或其任何衍生产品都不pcre2grep
是为了做到这一点而设计的,并且没有选择以自己可靠的方式获得此结果。正是出于这个原因,最好使用实际上设计用于实现此目的的工具,例如sed
我awk
之前提到的工具。它们都更可靠且更易于使用来获得您想要的东西,并且不需要任何修改或不必确切知道在您希望输出停止的位置之前有多少行。您可能已经打算使用它,pcre2grep
但重要的是要认识到有更好的选择并使用其中之一。