在Emacs中,如何仅在匹配的行上替换

use*_*948 4 emacs elisp

例如:在VIM中,

test
sample replace
test1
replace
sample test2
Run Code Online (Sandbox Code Playgroud)

:g/sample/s/replace/test3/ - 只会在匹配的行中用"sample"替换"replace"

test
sample test3
test1
replace
sample test2
Run Code Online (Sandbox Code Playgroud)

在VIM中,只能在非匹配行上替换,可以通过以下方式完成:v/sample/s/replace/test3 - 仅在不包含"sample"的非匹配行上替换"replace"

test
sample replace
test1
test3
sample test2
Run Code Online (Sandbox Code Playgroud)

如何使用emacs完成上述事情?

phi*_*ils 17

你使用的是Emacs 24吗?如果是这样,您可以使用内置的出现编辑模式:

  • 首先使用其中一个出现的函数来获得与您的模式匹配的行的缓冲区:(
    M-x occur RET模式)RET
  • 现在按e进入发生编辑模式,仅对这些行执行交互式编辑.
  • 搜索和替换.
  • 最后,C-cC-c退出出现编辑模式,并q关闭发生缓冲区.

有些第三方库可以在早期版本的Emacs上执行类似的技巧.我相信moccur-edit是其中之一,但我从未使用它.

编辑:关于你问题的第二部分,虽然我不熟悉更直接的方法来实现它,但我们可以通过这种方法来实现它:

  • M-x occur RET . RET获取包含所有行的缓冲区
  • C-xC-q 使缓冲区可写
  • M-x flush-lines RET(模式)RET删除匹配的行
  • C-xC-q 使再次发生缓冲区只读
  • e 调用发生编辑模式(然后像以前一样继续...)