0

我有大量文件需要完全删除某个函数调用。我做的第一件事是从的输出find-dired中生成dired文件列表:find

find . \( -type f -exec egrep -q -i -e "awesomeMethod\(\s*true\s*\)" \{\} \; \) -ls

现在我有很多文件。所以我点击t切换所有它们,它们变得突出显示。然后我点击Q,这会显示query-replace-regex所有标记的文件。我不知道要摆脱此调用的每个文件中调用的变量是什么,例如,它可能正在删除$a->awesomeMethod(true);or $betterVariableName->awesomeMethod(true);,因此我需要一个真正的正则表达式。我在想\S+\->awesomeMethod\(\s*?true\s*?\)什么,然后什么都没有。我知道这绝对不是完美的——它是一种上下文无关的语法:-P——但它会让我很接近。

当这个正则表达式不匹配任何东西时,我感到很惊讶,因为它与生成我的文件列表的正则表达式几乎相同。然后我看到它甚至awesomeMethod\(true\)不匹配任何东西,当我正在寻找它应该匹配的东西时。考虑到由于 lisp (即使我是交互式地这样做),我可能不得不双重转义括号,我尝试awesomeMethod\\(true\\)了再次不匹配。然后,令人惊讶的是,awesomeMethod(true) 确实匹配,当这显然不应该出现在正则表达式中时,因为它(...)表示一个捕获组。单个文件的 MS-% 给出相同的结果。

我究竟做错了什么?Emacs 24.3。

4

1 回答 1

2

emacs 正则表达式中的括号按字面意思使用,除非它们用反斜杠转义(然后它们表示捕获组)。

以下是更多信息的链接: http ://www.gnu.org/software/emacs/manual/html_node/emacs/Regexp-Backslash.html

于 2013-07-02T20:14:20.347 回答