在Emacs中的目录/子目录中的所有文件中替换文本?

时间:2016-06-06 09:48:53

标签: replace emacs directory

我需要替换目录中所有文件中的某个字符串,该目录中包含需要替换文件的子目录。有没有办法在Emacs中实现这一目标?

3 个答案:

答案 0 :(得分:3)

我通常按照@lawlist建议的方式这样做。这是一步一步:

  1. 从Melpa或其他方式安装wgrep。我也推荐 如果您使用The Silver Searcher,则wgrep-agag

  2. 使用M-x rgrep(或M-x ag)搜索文件并获取列表 可能发生变化的行。

  3. *grep*缓冲区中,运行M-x wgrep-change-to-wgrep-mode。一世 将其绑定到C-x C-q中的grep-mode-map

  4. 使用query-replace-regexpC-M-%),或在中进行任何其他编辑 *grep*缓冲区。

  5. 使用*grep*保存C-x C-s缓冲区。使用C-c C-k中止。在您保存更改之前,更改仅存在于*grep*缓冲区中。您可以多次重新启用wgrep模式。

  6. grep搜索中的所有文件现在都有开放缓冲区 如果您保存了*grep*缓冲区,则对它们进行修改。做C-x s 将所有这些保存到磁盘。

答案 1 :(得分:2)

以交互方式执行此操作的方法是获取所有文件的目录列表,标记您感兴趣的文件(可能是整个文件),然后对所有文件运行查询替换。

这样的事情:

  1. 在您的目录上运行find-dired,使用参数-type f来获取文件而不是目录(您可以按类型-type f -name "*.txt"进一步按类型过滤)。这将为您提供所有文件的直接列表。
  2. 标记所有文件( T 将通过切换标记执行),或标记包含特定文本的文件(使用%g )。
  3. 现在使用 S-Q (大写Q)对所有标记文件运行query-replace-regexp
  4. 如果查询替换进展顺利,您可以通过输入来加速,而无需询问。

答案 2 :(得分:0)

我为此写了一个包。看到: http://ergoemacs.org/emacs/elisp-xah-find-text.html 经过5年的试验,我到达了它的所有方法的错误。

它完全在emacs lisp中实现,不依赖于shell find / grep / sed等。所以在Windows中工作正常。此外,它确实找到/替换一个镜头,彩色报告。所以它很快,让你快速检查结果以防万一。可选择备份。

如果您只想使用普通的emacs,那么:

  • 在dir中调用dired列出文件,或者如果需要所有子目录,则调用find-dired。
  • 标记您想要的文件。您可以通过键入【%m】来标记正则表达式。
  • 键入Q以调用dired-do-query-replace-regexp。
  • 键入查找正则表达式并替换字符串。 〔见common常见的elisp正则表达式〕
  • 对于每次出现,键入y替换,n键跳过。输入【Ctrl + g】键中止整个操作。
  • 类型!要在不询问的情况下替换当前文件中的所有匹配项,N将跳过当前文件的其余部分的所有可能替换。 (N仅为emacs 23)
  • 要在不进一步询问的情况下对所有文件进行替换,请键入Y.(仅限Emacs 23)
  • 调用ibuffer列出所有已打开的文件。
  • 输入【* u】标记所有未保存的文件,输入S保存所有标记的文件,输入D将其全部关闭。

更多细节 http://ergoemacs.org/emacs/find_replace_inter.html