我有大量文件需要完全删除某个函数调用。我做的第一件事就是使用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);
或$betterVariableName->awesomeMethod(true);
,所以我需要一个真正的正则表达式。我正在考虑\S+\->awesomeMethod\(\s*?true\s*?\)
或其他东西,并将其替换为零。我知道这绝对不是完美的 - 这是一个无语境的语法:-P - 但它会让我接近。
当这个正则表达式与任何东西都不匹配时,我感到很惊讶,因为它几乎与生成我的文件列表的正则表达式相同。然后我看到即使awesomeMethod\(true\)
与任何东西都没有匹配,当我正在寻找它应该匹配的东西时。想到也许我不得不因为lisp而双重转义括号(即使我是以交互方式进行此操作),我尝试了awesomeMethod\\(true\\)
,这再次无法匹配。然后,令人惊讶的是,awesomeMethod(true)
确实匹配,因为(...)
表示捕获组,因此显然不应该在正则表达式中。单个文件上的M-S-%给出相同的结果。
我做错了什么? Emacs 24.3。
答案 0 :(得分:2)
emacs正则表达式中的括号是字面上的,除非它们使用反斜杠进行转义(然后它们表示捕获组)。
以下是更多信息的链接: http://www.gnu.org/software/emacs/manual/html_node/emacs/Regexp-Backslash.html