通过脚本使用vi编辑器

时间:2015-06-24 15:24:59

标签: shell ksh

我正在使用Korn shell。有一个不断更新的日志文件。我需要更新此文件并在其中插入一个字符。我正在为它编写一个shell脚本。任何人都可以建议我如何通过脚本来做到这一点?我需要使用vi编辑器通过脚本打开和关闭该文件。请建议一个方法。

以下是我编辑该文件时使用的命令: vi my_file 按'E / e'(开始编辑) 按“i”(插入) 按'F'(插入缺少的F) 按:Esc - > : - > WQ! - > [输入] - > y - > [确定] *

我需要在此文件的第一行开头插入一个F.请有人建议我如何通过vi编辑器完成它吗?我不能使用任何其他编辑器,比如' sed'因为该文件不断更新。

2 个答案:

答案 0 :(得分:0)

vi是一个“视觉”编辑器。它旨在通过人们观看终端并输入命令来交互使用;这就是“视觉”的意思。

vi等效的脚本驱动程序为ex。 (通常,ex实际上是由vi包提供的,甚至是同一个可执行文件。

如果您可以在vi的命令模式中编写可以执行所需操作的内容,则可以将其作为脚本提供给ex

一个例子,针对Apple的BSD ex进行了测试:

ex -c ':open filename-to-edit' -c '1s/^/F/' -c ':wq'

针对ex附带的vim测试的示例:

ex -s filename-to-edit <<'EOF'
1s/^/F/
:wq
EOF

或者,完全不使用viex

tempfile=$(mktemp)
{ printf %s 'F'; cat filename-to-edit; } >"$tempfile"
mv "$tempfile" filename-to-edit || rm -f "$tempfile"

答案 1 :(得分:0)

我想你想要一个答案

vi my_file <@ >/dev/null 2>&1
iF<ESC>
:wq
@

使用ESC的转义序列,可以通过键入CTRL-V ESC来输入 之前的换行符:不需要wq,但这使垃圾更容易阅读。

我担心这个解决方案大部分时间都会有效,直到一些日志记录消失。 vi制作文件的工作副本,编辑工作副本并写回该副本。编辑期间的更改将不会显示。您可以通过在两个窗口中使用vi打开相同的文件来检查这一点。甚至在一个窗口中:

vi testfile <@ >/dev/null 2>&1
iFirstline
Second Line<ESC>
:r !date
:w
:! echo This line will be gone >> testfile
:wq
@

现在检查测试文件。