如何在不打开文件的情况下在 vi 中应用正则表达式命令



我有一组需要相同编辑的多个文件,我正在尝试创建一个 bash 脚本以在 vi 中编辑它们,但是我不知道如何在脚本中使用 vi 进行编辑?任何建议都会有所帮助。

我强烈建议使用sedawk,这两个程序都使用正则表达式来选择和处理文本。

但是这也是使用 vim 的方法:

Vim 有一个ex模式(又名命令行版本),它解决了这个目的,并且在脚本中更容易使用。从这个答案中获取解决方案:

您可以简单地在 bashscript 中包含以下内容:

ex $yourfile <<EOEX
  :%s/$string_to_replace/$string_to_replace_it_with/g
  :x
EOEX

例如:

ex file.txt << EOEX
  :%s/hello/world/g
  :x
EOEX

或者您可以使用 -c 选项将ex命令传递给 vim。例如:

vim file.txt -c ':%s/hello/world/g' -c 'wq'
如果你想

做一个:s命令,那么你可以很好地使用sed,或者你可以按照@fnatic_shank的建议使用vim -c。 对于更复杂的脚本,可以使用-S script.vim而不是多个-c参数。 我喜欢使用

$ vim -e -s -N -V0vim.log -S script.vim infile.txt

请参阅有关-N-V-S的帮助,尤其是

:help -s-ex

其中包括警告

如果 Vim 似乎卡住了,请尝试键入"qa! 你没有 获得提示,因此您看不到 Vim 正在等待您输入 东西。

(我在测试我的答案时遇到了这个问题。 我在 vim 中保持 infile.txt 打开,所以当我尝试如上所述启动新的 vim 时,它会询问如何处理现有的交换文件。 如果要将文件发送到 stdout,那么在 script.vim 的末尾可能有以下两行:

g/^
silent q!

最新更新