我需要在一个目录中的所有文件中替换某个特定字符串,这个目录下还有子目录,其中的文件也需要被替换。在Emacs中是否有实现这一需求的方法?
我通常采用@lawlist建议的方法。以下是逐步说明:
从Melpa或其他途径安装wgrep
,如果您使用The Silver Searcher,则还推荐wgrep-ag
和ag
。
使用M-x rgrep
(或M-x ag
)搜索文件并获取潜在更改行的列表。
在*grep*
缓冲区中,运行M-x wgrep-change-to-wgrep-mode
。我将其绑定到grep-mode-map
中的C-x C-q
。
使用query-replace-regexp
(C-M-%
)或在*grep*
缓冲区中进行任何其他编辑。
使用C-x C-s
保存*grep*
缓冲区。使用C-c C-k
取消。更改仅存在于*grep*
缓冲区中,直到您保存它。您可以多次重新启用wgrep
模式。
如果保存了*grep*
缓冲区,则grep搜索中的所有文件现在都具有修改后的打开缓冲区。使用C-x s
将它们全部保存到磁盘。
普通的emacs:
更多细节请参见 http://ergoemacs.org/emacs/find_replace_inter.html
或者,我编写了一个专门用于此目的的包。请参见: http://ergoemacs.org/emacs/elisp-xah-find-text.html 经过5年的尝试和错误后,我终于找到了它。
它完全使用emacs lisp实现,不依赖于shell find/grep/sed等。因此在Windows上可以很好地工作。此外,它一次完成查找/替换,并带有彩色的报告。所以它很快,让您可以快速检查结果以防万一。备份是可选的。
grep
查找所有需要更改的位置,然后使用wgrep
将它们全部更改。在wgrep
中,您可以使用M-x replace-string
或使用multiple-cursors
。 - lawlist