【问题标题】:How to apply regex commands in vi without opening a file如何在不打开文件的情况下在 vi 中应用正则表达式命令
【发布时间】:2014-01-18 07:37:09
【问题描述】:

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

【问题讨论】:

  • 您可以使用sed 而不是vi。您可以在脚本中使用sed
  • 你能指定你的same set of edits是什么吗?
  • 对不起,我应该改写一下,我想在大约 100 个文件上应用一组记录的顺序命令(使用 qq)
  • @sat 感谢您的 sed 建议,我将使用它。虽然我想知道是否可以使用 vi。

标签: bash vim editor vi


【解决方案1】:

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

但你也可以使用 vim 来做到这一点:

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

您可以在 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'

【讨论】:

    【解决方案2】:

    如果你想做一个:s 命令,那么你可以使用sed,或者你可以使用vim -c,正如@fnatic_shank 所建议的那样。对于更复杂的脚本,您可以使用 -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 时,它询问如何处理现有的交换文件。)如果你想发送文件到标准输出,那么你可能在 script.vim 的末尾有这两行:

    g/^
    silent q!
    

    【讨论】:

      猜你喜欢
      • 2021-07-13
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多