pcregrep(或 pcre2grep)是否具有与 grep 的 --max-count 选项等效的功能?

pcregrep(或 pcre2grep)是否具有与 grep 的 --max-count 选项等效的功能?

获取以下文件:

aaa
bbb
XXX
ccc
ddd
eee
XXX
fff
ggg

我想打印,pcregrep,直到第一行包含以下内容的所有行XXX

aaa
bbb
XXX

有可能吗(用pcregreppcre2grep)?

我实现了这一点:

$ pcre2grep -nM '(.|\n)*?XXX' file
1:aaa
bbb
XXX
4:ccc
ddd
eee
XXX

有没有办法在第一场比赛后退出?好像pcre2grep没有--max-count类似的选项grep

注意:我知道有更好的工具可以获得所需的结果(sed等等),但我不是在这里寻找替代解决方案。我的问题是关于pcregrepor pcre2grep,我想知道是否有办法模拟grep--max-count选项。

答案1

由于您使用的是 Debian 9 (Stretch),因此您拥有的版本pcre2-utils包括pcre2grep10.22。该版本不包括-m--max-count在一定数量的比赛后退出的选项。话虽这么说,您想要做的事情(打印一个字符串)对于您所拥有的版本来说根本不可能。

Debian 11 (Bullseye) 10.34 附带的版本确实有此选项。您可以在必须通过以下命令实现预期输出的文件上使用它:

pcre2grep -B2 -m1 XXX file

您也可以使用正则来执行此操作,grep因为您的情况不需要使用与 Perl 兼容的正则表达式:

grep -B2 -m1 XXX file

-n不需要该选项,因为它只是打印不在预期输出中的行号,并且该-M选项与该选项冲突,-m因为前者告诉它匹配多行。

上述命令的输出:

aaa
bbb
XXX

打印到字符串的第一个匹配项XXX以及它之前的两行;但是,我不建议这样做,因为您必须确切地知道从行首到字符串出现了多少行。对于您的特定文件来说,这可能不是问题,但如果文件包含数千或数百万行,则会出现问题。

实际上,您想要做的是打印从文件开头到(包括某个字符串)的所有内容。grep其任何衍生产品都不pcre2grep是为此而设计的,并且没有选择以可靠的方式自行获得此结果。正是由于这个原因,最好使用实际设计来实现此目的的工具,例如我之前提到的sedawk我之前提到的。它们都更可靠且更易于使用来获得您想要的内容,并且不需要任何修改或必须确切地知道在您希望输出停止的位置之前有多少行。您可能出于使用的目的而进入这一领域pcre2grep,但重要的是要认识到有更好的选择并使用其中之一。

相关内容