22

<?=我的目标是用 ack找到所有出现的“ ”。我怎样才能做到这一点?

ack "<?="

不工作。请告诉我如何解决这里的逃逸问题?

4

4 回答 4

29

由于ack使用 Perl 正则表达式,您的问题源于这样一个事实,即在 Perl RegEx 语言中,?是一个特殊字符,意思是“最后一个匹配是可选的”。所以你正在寻找的东西=前面是一个可选的<

所以你需要逃避?if 那只是一个普通的角色。

要逃脱,有两种方法 - 要么<\?=要么<[?]=; 有些人发现转义的第二种形式(将特殊字符放入字符类)比反斜杠转义更具可读性。

更新正如 Josh Kelley 在评论中慷慨地添加的那样,第三种转义形式是使用\Q操作符来转义以下所有特殊字符,直到\E遇到,如下所示:\Q<?=\E

于 2010-06-19T02:52:30.630 回答
20

您可以使用 -Q 来引用需要引用的所有内容,而不是试图记住哪些字符必须被转义。

于 2010-06-19T04:51:03.503 回答
14
ack -Q "<?="

如果您想通过简单的文本查找,这是最好的解决方案。

(如果您不需要通过正则表达式查找。)

于 2015-01-30T02:52:29.030 回答
8
ack "<\?="

? 是一个正则表达式运算符,所以它需要转义

于 2010-06-19T02:51:53.850 回答