我正在使用Korn shell。有一个不断更新的日志文件。我需要更新此文件并在其中插入一个字符。我正在为它编写一个shell脚本。任何人都可以建议我如何通过脚本来做到这一点?我需要使用vi编辑器通过脚本打开和关闭该文件。请建议一个方法。
以下是我编辑该文件时使用的命令: vi my_file 按'E / e'(开始编辑) 按“i”(插入) 按'F'(插入缺少的F) 按:Esc - > : - > WQ! - > [输入] - > y - > [确定] *
我需要在此文件的第一行开头插入一个F.请有人建议我如何通过vi编辑器完成它吗?我不能使用任何其他编辑器,比如' sed'因为该文件不断更新。
答案 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
或者,完全不使用vi
或ex
:
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
@
现在检查测试文件。