使用vim在多个文件中进行搜索和替换

7

在vim中,是否可以在多个文件中应用相同的搜索和替换操作?以下是一个示例。

我有多个txt文件 - 从sad1.txt到sad5.txt。要打开它们,我将使用vim sad*指令进行打开。现在,在这五个txt文件中,有类似的单词happy999,我想将其更改为happy111。目前,我正在使用以下代码:

argdo %s/happy999/happy111/gc | wq!

最终只有 sad1.txt 被改变了。我应该怎么做才能在这 5 个 txt 文件中运行一个脚本呢?


你使用的是 vi 还是 vim?如果你只输入 vi,它会显示 vim 的横幅消息吗?wq! 可能会引起问题。在运行之前使用:set aw(自动写入)。如果你使用的是 vim,请查看 :help argdo,因为它是相对于普通的 vi 扩展文档。 - Jonathan Leffler
1
感谢您让我知道argdo的存在。 - Jonathan Leffler
你也可以使用映射。:map <F12> :%s/source/target/g<CR>:w!<CR>:next<CR> - SibiCoder
4个回答

9

使用:

:set aw
:argdo %s/happy999/happy111/g

第一行设置自动写入模式,这样当您在文件之间切换时,vim会在文件更改时将其写入。
第二行执行全局搜索和替换。
请注意,它不使用wq!,因为那会退出。如果您不想使用自动写入,则可以使用:
:argdo %s/happy999/happy111/g | w

这样做可以避免在编辑第一个文件结束时终止vim。 此外,建议查看关于vivim的问题的答案。

我一直害怕没有 [range]argdo。我学到了有用的东西,谢谢。 - grochmal
你好,Jonathan。它有效。谢谢。跟进问题。我想问一下。是否有可能编写并保存?还需要每次都设置吗? - Roger Sim
通常情况下,您每个vim会话只需设置一次aw。我不明白您所说的“写入并保存”的意思,请澄清一下。 - Jonathan Leffler
:argdo %s/happy999/happy111/g | w 这个命令对所有文件都起作用。但是如果我加上 | wq! ,只有第一个文件会被修改。 - Roger Sim
你期望它做什么?q代表“退出”;如果vim没有退出,q打断处理也不是不合理的。 - Jonathan Leffler

1
毫无疑问,argdo 很棒,但是随着时间的推移,输入那么多样板变得非常烦人。试试 far.vim。它是一个提供许多 IDE 的工具。

enter image description here


我真的看不出这个有什么用处。你输入fardo而不是argdo?虽然字母数量相同,但不够直观。所有优秀的程序员都应该能够闭着眼睛使用Vim,因为他们可以盲打并知道他们的代码在哪里。我还是坚持使用vimtmuxbash,谢谢。 - undefined

1

1
这是一个关于编程的任务,需要使用sed -i命令(-i表示“原地编辑”,仅适用于GNU sed)。但是,如果你真的想使用vim或者确实需要/c来确认替换,你可以有两种方法来完成它:
第一种方法:利用shell的帮助。
for i in sad*.txt; do
    vim -c ':%s/happy999/happy111/gc' -c ':wq' "$i"
done

(/c 仍然有效,vim会要求每次确认)

或者使用纯VIM

vim -c ':%s/happy999/happy111/gc' -c ':w' -c ':n' \
    -c ':%s/happy999/happy111/gc' -c ':w' -c ':n' \
    -c ':%s/happy999/happy111/gc' -c ':w' -c ':n' \
    -c ':%s/happy999/happy111/gc' -c ':w' -c ':n' \
    -c ':%s/happy999/happy111/gc' -c ':wq' sad*.txt

在我看来,这最后一个看起来很糟糕且重复,并且与shell中的for没有真正的优势,但它表明纯粹的vim可以做到这一点。

2
“vim”的“argdo”命令看起来应该很有帮助——它可以完成有用的工作,而不需要重复输入。 - Jonathan Leffler
vim -c ':%s/happy999/happy111/gc 和下面的代码中,不应该有 冒号 - Devaroop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接