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

Mic*_*Wei 2 directory emacs replace

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

Jua*_*cho 5

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

像这样的东西:

  1. 在您的目录上运行find-dired,使用参数-type f来获取文件而不是目录(您可以使用类似的类型在此处进一步过滤-type f -name "*.txt")。这将为您提供包含所有文件的可怕列表。
  2. 标记所有文件(T通过切换标记来完成),或标记包含特定文本的文件(使用% g)。
  3. 现在使用(大写 Q)query-replace-regexp对所有标记的文件运行 a 。S-Q

如果查询替换顺利,您可以通过键入!继续而无需询问来加快速度。


jpk*_*tta 5

我通常按​​照@lawlist 建议的方式执行此操作。这是一步一步的:

  1. wgrep从 Melpa 或其他方式安装。我还建议 wgrep-ag,并ag如果您使用的银色搜索者。

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

  3. *grep*缓冲区中,运行M-x wgrep-change-to-wgrep-mode. 我将它绑定到C-x C-qin grep-mode-map

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

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

  6. 如果您保存了*grep*缓冲区,grep 搜索中的所有文件现在都有打开的缓冲区,并对其进行了修改。难道C-x s 要所有的人都保存到磁盘。