2012-07-27 130 views
15

我想在我的latex文档中找到不存在\XXX命令形式的XXX的出现次数。因此,我正在查找不带反斜杠的事件。grep反向反斜杠

我试过如下:

grep -c -e '(?<!\)XXX' test.tex #result: grep: Unmatched) or \) 
grep -c -e '(?<!\\)XXX' test.tex #result: 0 
grep -c -e "(?<!\\)XXX" test.tex #result: -bash: !\\: event not found 

他们没有工作打算。事实上,我根本不明白最后的错误信息。

我test.tex只包含以下行

%test.tex 

XXX 

\XXX 

因此该预期的结果1

任何想法?

Ps .:我在bash工作。

+0

仅供参考,在你的最后一个例子中,!!在双引号中被解释为历史扩展,但'!\\'不是有效的历史扩展表达式。 – chepner 2012-07-27 12:46:57

回答

28

标准和正则表达式都不支持后面的外观。使用Perl的正则表达式:

grep -P '(?<!\\)xxx' test.tex 
+0

这似乎工作,除了我做了一个交叉检查,其中我搜索'XXX'为'\\ XXX'和'(?<!\\)XXX'。第一个给了39个,第二个10个,最后一个34个。这些数字没有加起来,所以有些东西不像我预期的那样工作。但这可能超出我最初的问题。 – Simon 2012-07-27 10:27:52

+0

@Simon:也许在同一行有几个事件? – choroba 2012-07-27 10:29:27

1

尝试使用

grep -P '(?<!\\)\bXXX\b' test.tex 
+0

这有帮助,但根据我的grep手册页,-P是“高度实验性的”,这是否仍然如此?有没有一种非珍珠的方式来做grep的lookbeheads和lookaheads? – 2016-12-30 17:30:57

+2

@santiagoarizti:'grep -P'在这里已经很长时间了,我从来没有听说过它应该被认为是“实验性的”。由于我喜欢Perl的正则表达式功能,我总是使用这个开关并使用Perl格式。 – 2017-01-02 13:48:10

0

如果你的GNU grep应该支持与--perl,正则表达式或-P命令行选项Perl兼容的正则表达式。经典的perl正则表达式只支持否定的字符类,例如,[^ a]表示除“a”以外的任何字符。

您给出的示例看起来像Perl兼容的正则表达式,而不是传统的正则表达式,您必须将GNU grep与--perl-regexp或-P命令行选项一起使用,或者可以安装启用了PCRE的grep,例如“pcregrep” - 它不需要PCRE的任何命令行选项,因此更方便。

此外,你的模式看起来不像一个负面的断言。它应该是

(?!pattern) 

不是

(?<!pattern) 

找到更多在这里:https://perldoc.perl.org/perlre.html

如果你喜欢Perl兼容的正则表达式和有Perl,但没有pcregrep或你的grep没有按” t支持--perl-regexp,你可以使用像grep一样工作的单行perl脚本。 Perl以与grep相同的方式接受stdin,例如

ipset list | perl -e "while (<>) {if (/packets(?! 0)/){print;};}"