Emacs交互式正则表达式替换

21

假设您有一些包含以下单词的文本:

"foo" ... "bar" ... "file" ... "emacs"

如果你只想把双引号替换成单引号,可以通过以下替换来实现:

" -> ''

但是假设您想以交互方式和正则表达式处理更复杂的情况,该如何实现?

我解释得更清楚一些:我希望能够使用命令或一系列命令以以下方式工作:

  • 编写正则表达式,例如"\\(.*?\\)",并交互式地查看结果(即在编辑正则表达式时突出显示当前可见匹配项,并随着进行更改而始终更新突出显示)。
  • 一旦满意于正则表达式,请指定替换文本,例如' '\1' '
  • 交互式地替换所有匹配项

你是什么意思说 "递归"? - event_jr
event_jr:我根据Luigi的回答更新了问题,并重新表述了那部分内容,因为它似乎不相关。 - phils
3个回答

25

终于找到了!!!以下是需要遵循的步骤:

  • M-x isearch-forward-regexp

  • 交互式地插入您的正则表达式。如果您犯了一个错误,可以使用DEL或M-e并浏览您的正则表达式以进行更正。

  • 然后,在找到想要的内容后立即按下M%,输入您想要替换的内容并开始替换。

这样就可以完全交互式和逐步地使用正则表达式进行搜索和替换。


1
不错的发现。在我的安装中,isearch-forward-regexp绑定到C-M-s - High Performance Mark
3
M-x isearch-describe-bindings(或C-s C-h C-h b)值得一读,它可以让你更好地了解搜索功能的绑定键。 - phils
感谢您。isearch-describe-bindings也非常有帮助,但我希望我能在Emacs中发现它的一些直觉。我经常在Emacs的广泛文档中迷失。 - Peter Gaultney

8
  • 运行 M-x isearch-forward-regexpC-M-s

  • 当您开始输入正则表达式时,第一个匹配项将立即高亮显示。尝试使用光标向后移动正则表达式将取消搜索,因此如果您犯了错误,则应使用 M-e 进行编辑,进行更改,然后按 Enter 继续搜索。

  • 当您对正则表达式感到满意时,请按 M-%,键入替换字符串(或使用上箭头访问先前使用的替换字符串),然后按 RET 开始交互式替换。

  • 对于每个匹配项,按 y 进行一次替换,按 n 跳过,按 ! 替换所有,按 RET 退出,或按 ? 查看其他选项。

  • 要重复上次的正则表达式搜索,请输入 C-M-s 然后输入 C-s

完整详情请参阅手册页面


我只是想为Luigi的答案添加一些细节,但由于我的编辑被拒绝了,所以我将其作为一个单独的答案发布。 - Ian Mackinnon
愿原力与你同在。爱意满满, - Boris Stitnicky

7

您是否满意于使用query-replace-regexp命令?在大多数Emacs安装中,它将绑定到C-M-%

由于这不符合OP的要求,请尝试查看re-builder。该功能未在Emacs手册或帮助系统中记录,但在Emacs Lisp手册中有相关文档。


query-replace-regexp不是交互式的,或者说更好的是增量式的。我希望有一种增量的方式来查看它所匹配的内容。 - Luigi Tiburzi
对我来说它没有起作用,所以它既不交互也不增量。你有任何想法吗?我通过apt-get下载了emacs。顺便说一下,我已经发布了在我的情况下有效的解决方案。 - Luigi Tiburzi
抱歉,当您回复时,我刚刚删除了我的第一条评论。我没有理解您想要在构建正则表达式时进行增量匹配突出显示的内容,这就是为什么我感到困惑。现在我明白您想要什么了。 - phils

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接