我想要执行以下操作的bash shell
保存并退出文件
bashpromt# cat mybash.sh
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
#close the that file.
echo "done."
有可能吗?我找到了类似vim脚本的东西,但不知道如何使用它。 或者像“HERE”doc这样的东西可以用于此吗?
编辑:我需要验证vim编辑器在我们的文件系统上工作正常。所以我需要编写调用vim的脚本并执行一些命令并关闭它。我的要求不适合像“echo”这样的东西“> file.txt”。我必须使用vim打开文件。答案 0 :(得分:16)
ex
是vi
的命令行版本,在脚本中更容易使用。
ex $yourfile <<EOEX
:%s/$string_to_replace/$string_to_replace_it_with/g
:x
EOEX
答案 1 :(得分:10)
Vim有几个选择:
-c
=&gt;传递ex命令。示例:vim myfile.txt -c 'wq'
强制文件的最后一行被换行(除非脚本以某种方式设置binary
)-s
=&gt;播放用-W
录制的脚本。例如,如果您的文件包含ZZ
,则vim myfile.txt -s the_file_containing_ZZ
将执行与之前相同的操作。另请注意,调用为ex
时,vim将以ex模式启动;你可以尝试ex my_file.txt <<< wq
答案 2 :(得分:5)
你问过如何通过vim将“某些东西”写入文本文件中,但尚无答案。
插入文字:
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
这会将“匹配结束开始”的第一次出现更改为“匹配我的文本以插入匹配结束”。
如果您希望在关键字之间允许搜索任意数量的空白,请使用\_s*
。例如,搜索返回0的函数::/\_s*return\_s*0}
答案 3 :(得分: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
- 进入插入模式并输入“文件中的内容”
<ESC>
- 退出插入模式
:wq
- 写入文件并退出vim
答案 4 :(得分:1)
最近我有answered一个类似的问题,“automated edit of several files”。可能是我描述的解决方案,可满足您的需求。