Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 通过脚本使用vi编辑器_Shell_Ksh - Fatal编程技术网

Shell 通过脚本使用vi编辑器

Shell 通过脚本使用vi编辑器,shell,ksh,Shell,Ksh,我正在与Korn shell合作。有一个日志文件正在不断更新。我需要更新此文件并在其中插入一个字符。我正在为它编写一个shell脚本。有人能建议我如何通过脚本来完成吗?我需要通过脚本使用vi编辑器打开和关闭该文件。请建议一种方法 以下是编辑该文件时使用的命令: 我的档案 按“E/E”(开始编辑) 按“i”(插入) 按“F”(插入缺少的F) 按:Esc->:->wq!->[输入]->y->[输入]* 我需要在文件第一行的开头插入一个F。有人能建议我如何通过vi编辑器来实现吗?。我不能使用像“sed

我正在与Korn shell合作。有一个日志文件正在不断更新。我需要更新此文件并在其中插入一个字符。我正在为它编写一个shell脚本。有人能建议我如何通过脚本来完成吗?我需要通过脚本使用vi编辑器打开和关闭该文件。请建议一种方法

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

我需要在文件第一行的开头插入一个F。有人能建议我如何通过vi编辑器来实现吗?。我不能使用像“sed”这样的任何其他编辑器,因为该文件正在不断更新。

vi
是一个“可视化”编辑器。它的目的是交互使用,由一个人看着终端并输入命令;这就是“视觉”的意思


相当于
vi
的脚本驱动是
ex
。(通常,
ex
实际上是由您的
vi
包提供的,甚至是相同的可执行文件)

如果您可以在
vi
的命令模式下编写一些您想要的东西,您可以将其作为脚本提供给
ex


以苹果的BSD
ex
为例:

ex -c ':open filename-to-edit' -c '1s/^/F/' -c ':wq'
根据
vim
附带的
ex
测试示例:

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

我想你也需要一个答案

vi my_file <@ >/dev/null 2>&1
iF<ESC>
:wq
@
vi我的文件/dev/null 2>&1
如果
: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
@
vi测试文件/dev/null 2>&1
iFirstline
第二线
:r!日期
:w
:! 回显此行将消失>>测试文件
:wq
@

现在检查测试文件。

与其假设
vi
是工作的正确工具,为什么不详细描述任务,以便人们可以建议合适的工具?“该文件正在不断更新”
vi
sed
没有原子性(虽然
sed-i
本身也有一些bug),所以我不知道您认为您正在解决什么问题……如果您有一个文件正在被其他进程更改,并且您希望确保您的更改不会影响其他进程想要进行的更改,然后,您需要查看建议锁定——并修改其他进程以执行相同的操作。通过“持续更新”,您的意思是另一个程序一直打开此文件吗?如果是这样,则
sed
vi
都不行
vi
将临时文件替换为原始文件,但程序仍将更新原始文件。在程序关闭之前,原稿不会被删除。如果您执行了
vi
操作,现在将丢失程序执行的所有更新(假设程序未锁定文件)。你为什么要这样做?你能告诉我如何使用“ex”的代码吗?使用一个代码块。@user286009,我提供了一个示例,例如它。由于您想使用
vi
,我假设您已经非常熟悉
vi
命令模式,能够为您想要执行的实际操作编写命令,因此唯一的问题是关于
ex
命令行用法。现在我更新了我的问题。请查看并提出建议。我已尝试了您建议的代码块,但它不起作用。我正在与korn shell合作。哪个供应商实施了
ex
?我的是用苹果公司推出的BSD衍生版本进行测试的。此外,通常,您需要提供比“不工作”更好的错误报告。不工作怎么办?文件没有更改吗?错误消息?如果是,要传达什么信息?等
vi testfile <@ >/dev/null 2>&1
iFirstline
Second Line<ESC>
:r !date
:w
:! echo This line will be gone >> testfile
:wq
@