从Bash shell脚本中打开Vim

17

我想编写一个Bash shell脚本,实现以下功能:

  1. 使用Vim打开一个文件;
  2. 往文件里面写入一些内容;
  3. 保存文件并退出。
echo 'About to open a file'
vim file.txt  # I need to use vim application to open a file
# Now write something into file.txt
...
# Then close the file.
...
echo 'Done'

这是否可能?我发现了一些叫做Vimscript的东西,但不确定如何使用它。 或者可以使用类似于here document的东西吗?

更新:我需要验证Vim在我们的文件系统上是否正常工作。因此,我需要编写一个脚本来调用Vim,执行一些命令,然后关闭它。我的要求不适合像echo 'something' > file.txt这样的操作。我必须使用Vim打开文件。


1
为什么不直接将文本放入文件中,而要这样做呢? - Ignacio Vazquez-Abrams
4
你是想让用户使用vim,还是希望bash脚本修改文件?在后一种情况下,使用vim有些过头了,你应该使用 exsed 或者 perl - osgx
我需要编写一个测试脚本来验证应用程序,如vim编辑器,在我们的文件系统上正常工作。 这是vim编辑器的测试用例。 - webminal.org
你只是在文件后追加内容吗?只需执行"stuff here" >> file.txt即可。 - CrayonViolent
3
关于“是否正常工作”的测试:您如何定义“正常工作”?如果您的系统上有vim(请检查其是否存在),并且您正在以对于您所编辑的文件具有正确权限的用户身份运行它,那么它将“正常工作”,也就是说vim会像任何其他地方一样按照其功能来执行,不多不少。 - CrayonViolent
5个回答

18

exvi的命令行版本,在脚本中使用更加容易。

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

+1,但实际上 ex 不是 Vim 的一个版本,它通常是指向 Vim 的符号链接。而 Vim 将检查 v:progname 来确定以何种模式启动。 - Benoit
谢谢。我以前不知道 ex!使用这种方法可以向文件添加一些内容吗?谢谢。 - webminal.org
对我来说没有用 - $ ex file.txt << EEE :i 你好 :x EEE - webminal.org

11

Vim有几个选项:

  • -c => 传递ex命令。例如:vim myfile.txt -c 'wq'会强制在文件的最后一行添加换行符(除非通过某些脚本设置了binary
  • -s => 播放使用-W记录的脚本输出。例如,如果您的文件包含ZZ,则vim myfile.txt -s the_file_containing_ZZ将执行与之前相同的操作。

还要注意,作为ex调用Vim时,它将以ex模式启动;您可以尝试ex my_file.txt <<< wq


谢谢,小伙子。离目标又近了一步 :D "vim file.txt -c 'wq'" 可以创建并保存文件,但如何在关闭之前添加内容“hello world”呢?谢谢。 - webminal.org
vim file.txt -c '$put ="hello world"' -c 'wq' - Benoit
这是否取决于vim版本?以下命令仍会创建空文件,但没有内容。命令是- vim file.txt -c '$put="hello"' -c 'wq' - webminal.org
2
@lakshmipathi:看起来 vim file.txt -c '$put =\'hello\'' -c 'wq' 更好用。 - Benoit

8
你问如何通过vim将“something”写入文本文件,目前还没有必要的回答。
要插入文本:
ex $yourfile <<EOEX
  :i
  my text to insert
  .
  :x
EOEX

:i 进入插入模式。直到单独一行出现.,其后所有的内容都将成为插入的文本。

以下是如何进行搜索和插入操作。你可以输入以下命令:

ex $yourfile <<EOEX
  :/my search query\zs
  :a
  my text to insert
  .
  :x
EOEX

这将查找与由:/指定的正则表达式匹配的第一个选择,将光标放置在由\zs指定的位置,并在光标后进入插入模式。

您可以移动\zs以实现不同的结果。例如:

ex $yourfile <<EOEX
  :/start of match \zs end of match
  :a
  my text to insert 
  .
  :x
EOEX

这将把第一个出现的“start of match end of match”更改为“start of match my text to insert end of match”。

如果您想在关键字之间允许任意数量的空格进行搜索,请使用\_s*。例如,搜索返回0的函数::/\_s*return\_s*0}


多年后,我后悔给出了这个答案。事实上,你可能不应该使用vim来做这件事。 - Patrick Michaelsen

1

1
如果你想要查看在vim或gvim中正在进行的工作,你可以使用--remote-send。
gvim --servername SHELL_DRIVER
bashpromt# cat mybash.sh
#!/bin/bash
echo "about to open $1"
gvim --servername SHELL_DRIVER $1 #I need to use vim application to open a file
#now write something into file.txt and close it
gvim --servername SHELL_DRIVER --remote-send '<ESC>i something to the file<ESC>:wq<CR>'
echo "done."

这样做会很慢,但可以实现你想要的功能。
首先,我们打开一个 gvim,在其中可以打开所有文件(以提高效率)。
使用第一行 gvim 命令在之前打开的 gvim 中打开文件。
在第二行 gvim 命令中,我们向之前打开的 gvim 实例发送命令(并保持所需文件打开状态)。
该命令如下:
<ESC> - 退出 gvim 的任何模式
i something to the file - 进入插入模式并输入“something to the file”
<ESC> - 退出插入模式
:wq - 写入文件并退出 vim


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