如何通过Shell脚本执行vim命令

6

您好,我有一个问题:

我正在编写一个shell脚本,需要向vim传递输入。

具体解释如下:

我已经编写了一个不可更改的shell脚本,以下是代码:

 sudo vim /mnt/etc/{hosts,hostname,ports}

由于这个主机文件已经打开,我们可以通过:n手动转到主机名文件,端口文件也是如此。
但我必须从我的.sh文件执行同样的操作。 我还必须编辑端口文件,并在完成后通过:wq命令保存并退出。
我该怎么做?

你是指交互式地打开文件,还是直接在脚本文件中进行编辑?如果是后者,您能否提供更多有关所需进行的编辑的详细信息?如果是前者,为什么不能将该命令原封不动地放入您的.sh文件中并运行它呢? - Donovan
@Donovan 从标题上看,我以为是后者——“通过shell脚本执行...命令”。 - Ben Klein
1
不是很清楚,vi不是用来这种方式的。它是一款可视化编辑器。如果你需要以编程的方式修改文件内容,使用流编辑器sed是更合适的方法。 - Donovan
@riscube4,这意味着如果你想通过shell脚本修改文件,应该使用sedawk,而不是vi - Donovan
@riscube4 另外,最终目标尚未明确。如果您能更详细地解释您想要做什么,也许会有人提供更精确的建议。 - givanse
显示剩余2条评论
1个回答

6

替代方案

除非你真正需要特殊的Vim功能,否则最好使用非交互式工具,如sedawk或Perl / Python / Ruby / 你最喜欢的脚本语言

即便如此,你也可以以非交互方式使用Vim:

静默批处理模式

对于非常简单的文本处理(即像增强版的'sed'或'awk'一样使用Vim,也许只是在:substitute命令中从增强的正则表达式中受益),请使用Ex模式

# Unix
vim -T dumb --noplugin -n -es -S "commands.ex" "filespec"

注意:如果"commands.ex"文件不存在,Vim将挂起等待输入;最好事先检查其是否存在!或者,Vim可以从标准输入读取命令。如果您使用-参数,则还可以从标准错误读取缓冲区中从标准输入读取的文本,并读取命令。

完全自动化

对于涉及多个窗口的高级处理和真正的Vim自动化(在这种情况下,您可能需要与用户交互或让Vim保持运行以让用户接管),请使用:

vim -N -u NONE -n -c "set nomore" -S "commands.vim" "filespec"

以下是使用的参数摘要:
-T dumb           Avoids errors in case the terminal detection goes wrong.
-N -u NONE        Do not load vimrc and plugins, alternatively:
--noplugin        Do not load plugins.
-n                No swapfile.
-es               Ex mode + silent batch mode -s-ex
                Attention: Must be given in that order!
-S ...            Source script.
-c 'set nomore'   Suppress the more-prompt when the screen is filled
                with messages or output to avoid blocking.

谢谢回复,我使用了 sed 并进行了一些更改,最终它起作用了。 - r15

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