获取以下文件:
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
没有--max-count
类似的选项grep
。
注意:我知道有更好的工具可以获得所需的结果(sed
等等),但我不是在这里寻找替代解决方案。我的问题是关于pcregrep
or pcre2grep
,我想知道是否有办法模拟grep
的--max-count
选项。
答案1
由于您使用的是 Debian 9 (Stretch),因此您拥有的版本pcre2-utils
包括pcre2grep
10.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
是为此而设计的,并且没有选择以可靠的方式自行获得此结果。正是由于这个原因,最好使用实际设计来实现此目的的工具,例如我之前提到的sed
或awk
我之前提到的。它们都更可靠且更易于使用来获得您想要的内容,并且不需要任何修改或必须确切地知道在您希望输出停止的位置之前有多少行。您可能出于使用的目的而进入这一领域pcre2grep
,但重要的是要认识到有更好的选择并使用其中之一。