作为这个问题的后续,它试图找出如何做这样的事情应该是容易的,特别是阻止我更习惯使用Emacs,而是启动我已经熟悉的编辑器.我经常在编辑多个文件时使用这个例子.
在Ultraedit中我会做Alt + s然后p来显示一个对话框,其中包含以下选项:查找(包括在多行中使用正则表达式),替换为,在文件/类型中,目录,匹配大小写,仅匹配整个单词,列表更改了文件和搜索子目录.通常我会先用鼠标点击拖动选择我要替换的文本.
只使用Emacs的本身(在Windows XP),而不调用任何外部工具,如何更换所有在酒吧\nbaz FOO\NBAR *.c
,并*.h
在某些文件夹中的文件和它下面的所有文件夹.也许Emacs不是最好的工具,但是如何通过最小的命令轻松完成?
M-x find-name-dired
:系统将提示您输入根目录和文件名模式.
t
对于找到的所有文件,按"切换标记".
按Q
"查询替换文件...":系统将提示您输入查询/替换正则表达式.
继续如下query-replace-regexp
:SPACE
替换并转移到下一场比赛,n
跳过比赛等.
按C-x s
保存缓冲区.(然后您可以按y
,n
或!
立即保存所有)
M-x find-name-dired RET
所有文件可能需要一些时间才能显示在列表中,滚动到底部(M->
)直到" find finished
"出现以确保它们都已加载
t
对于找到的所有文件,按"切换标记"
按Q
"查询替换文件...":系统将提示您输入查询/替换正则表达式.
继续执行query-replace-regexp:SPACE或y
替换并移动到下一个匹配,n跳过匹配等.
输入!替换当前文件中的所有实例而不要求,N
跳过所有可能的替换当前文件的其余部分.(N
仅限emacs 23+)
要在不进一步询问的情况下对所有文件进行替换,请键入Y
.
调用"ibuffer"(C-x C-b
如果绑定到ibuffer,或M-x ibuffer RET
)列出所有打开的文件.
键入* u
以标记所有未保存的文件,键入S
以保存所有标记的文件
* * RET
取消标记所有标记,或键入D
以关闭所有标记的文件
这个答案结合了这个答案,来自这个网站,以及我自己的笔记.使用Emacs 23+.
我通常使用其他工具来执行此任务,似乎EmacsWiki的"查找和替换跨文件"条目中提到的许多方法都出现了,但Findr包看起来非常有前途.
窃取源文件的一部分:
(defun findr-query-replace (from to name dir) "Do `query-replace-regexp' of FROM with TO, on each file found by findr.
提供的答案很棒,但我想我会添加一个稍微不同的方法.
这是一个更加互动的方法,并要求wgrep
,rgrep
和iedit
.二者iedit
并wgrep
必须通过MELPA或果酱(使用安装M-x package-list-packages
)
首先M-x rgrep
找到你要找的字符串.
您将能够指定文件类型/模式和要递归的文件夹.
接下来你需要运行wgrep
启动它C-s C-p
.
Wgrep会让你编辑rgrep
的结果,因此对字符串设定的区域相匹配,并开始iedit-mode
用C-;
(取决于你的终端上,你可能需要重新绑定此)
所有事件都可以立即编辑.C-x C-s
提交wgrep
.然后C-x s !
保存更改的文件.
此方法的主要好处是您可以使用iedit-mode
切换某些匹配M-;
.您还可以使用结果rgrep
跳转到文件中,例如,如果您有意外匹配.
我发现在项目中进行源编辑和重命名符号(变量,函数名称等)非常有用.
如果你还不知道/使用iedit模式它是一个非常方便的工具,我强烈建议你看看.
弹丸非常好:Cc pr运行命令projectile-replace
使用dired递归深层目录树对于此任务来说会有点慢.您可以考虑使用tags-query-replace.这确实意味着炮轰创建一个标签表,但这通常很有用,而且很快.
信息来源:1
对于emacs专业版用户:
调用dired列出目录中的文件,或者如果需要所有子目录,则调用find-dired。
标记所需的文件。您可以通过键入?%m?来用正则表达式标记。
键入Q以调用dired-do-query-replace-regexp。
输入查找正则表达式并替换字符串。?? 常见的elisp正则表达式模式?
对于每次出现,请键入y替换,输入n跳过。输入?Ctrl + g?中止整个操作。
输入!要在不询问的情况下替换当前文件中的所有匹配项,请N跳过当前文件其余部分的所有可能替换。(N仅是emacs 23)
要对所有文件进行替换而无需进一步询问,请键入Y。(仅适用于Emacs 23)
调用ibuffer列出所有打开的文件。输入?* u?要标记所有未保存的文件,请键入S以保存所有已标记的文件,键入D以将其全部关闭。
Emacs初学者分步指南
选择目标文件
通过在命令行界面提示符中键入“ emacs”来启动emacs。(或者,如果您在“图形用户界面”环境中,则双击Emacs图标)
在目录中选择文件
首先,您需要选择要进行替换的文件。使用图形菜单“文件”?打开目录?Emacs将要求您提供目录路径。键入目录路径,然后按Enter。
现在,将显示文件列表,现在您需要标记要使正则表达式查找/替换可继续使用的文件。您可以通过将光标移动到所需文件来标记文件,然后按m。按下u取消标记。(要列出子目录,请将光标移动到目录并按i。子目录的内容将在底部列出。)要用正则表达式标记所有文件,请键入“%m”,然后键入您的正则表达式模式。例如,如果要标记所有HTML文件,则键入?%m?。然后是.html $。(您可以在图形菜单“标记”中找到标记命令的列表(当您处于转向模式时,将显示此菜单)。
在目录及其所有子目录中选择文件
如果要查找/替换目录中的文件(包括数百个子目录),请使用以下方法选择所有这些文件。
致电查找。(您可以通过按?Alt + x来调用命令),然后键入目录名称?/用户/玛丽/我的文件
注意:如果要在Unix非图形文本终端上使用emacs,并且?Alt + x?不起作用,等效的击键是“ Esc x”。
Emacs将提示您“ Run find(with args):”。如果需要对所有HTML文件进行替换,请键入-name“ * html”。如果您不关心哪种文件,而只关心该目录下的所有文件,请输入“ -type f”。
现在,如上所述标记文件。
交互式查找/替换
现在,您准备好进行交互式查找替换。为了简单起见,假设您只想用“ super”代替“ quick”。现在,调用dired-do-query-replace-regexp。它将提示您输入正则表达式字符串和替换字符串。输入“快速”,输入,然后输入“超级”。
现在,emacs将使用您的模式并检查文件,并在发生匹配时停止并向您显示。发生这种情况时,emacs会提示您,您可以选择进行更改或跳过更改。要进行更改,请键入y。要跳过,请键入n。如果您只是想让emacs继续并对当前文件进行所有此类更改,请键入!。
如果要取消整个操作而不保存所做的任何更改,请键入“ Ctrl + g”,然后使用菜单“文件”退出emacs。退出Emacs吗?
保存更改的文件
现在,在经历了上述考验之后,您还需要执行另一个步骤,那就是保存更改后的文件。
如果您使用的是emacs 22版或更高版本,请调用ibuffer进入缓冲区列表模式,然后键入?* u?标记所有未保存的文件,然后键入S保存所有文件。(就是shift-s)
如果使用的是emacs版本21,则可以执行以下操作:调用list-buffers,然后将光标移至要保存的文件并键入s。它将标记文件以供以后保存操作。输入u取消标记。完成后,键入x以执行所有标记为保存的文件的保存。(在emacs中,打开的文件称为“缓冲区”。忽略那里的其他内容。)
除了上述选项之外,您还可以调用save-some-buffers“ Ctrl + xs”。然后emacs将显示每个未保存的文件,并询问是否要保存。
注意:emacs的正则表达式与Perl或Python的正则表达式不同,但相似。有关摘要和常见模式,请参阅:Emacs Regex。