【问题标题】:Working with vi editor through script通过脚本使用 vi 编辑器
【发布时间】:2015-09-10 21:33:40
【问题描述】:

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

以下是我在编辑该文件时使用的命令: vi 我的文件 按“E/e”(开始编辑) 按“i”(插入) 按“F”(插入缺失的 F) 按: Esc -> : -> wq! -> [回车] -> y -> [回车]*

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

【问题讨论】:

  • 与其假设vi 是适合这项工作的工具,为什么不足够详细地描述这项任务,以便人们可以提出合适的工具的建议?
  • “那个文件在不断更新”? vi 并不比 sed 更原子(虽然 sed -i 确实 有一些自己的错误),所以我不知道你认为你正在解决什么问题。跨度>
  • ...如果您有一个文件正在被其他进程更改,并且您想确保您的更改不会影响其他进程想要进行的更改,那么您需要查看在咨询锁定 - 并修改其他进程以执行相同的操作。
  • “不断更新”是指其他程序一直打开这个文件吗?如果是这样,那么 sedvi 都不会。 vi 用临时文件替换原始文件,但程序仍将更新原始文件。在程序关闭之前,原件不会去。如果您执行了vi,您现在将丢失程序所做的所有更新(假设程序没有锁定文件)。为什么需要这样做?

标签: shell ksh


【解决方案1】:

vi 是一个“可视化”编辑器。它旨在以交互方式使用,由人类查看终端并输入命令;这就是“视觉”的含义。


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

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


一个示例,针对 Apple 的 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

或者,完全不使用viex

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

【讨论】:

  • 你能建议我如何使用“ex”的代码吗?带有代码块。
  • @user286009,我已经提供了一个例子,就是这样。由于您想使用vi,我假设您已经足够了解vi 命令模式,可以为您要执行的实际操作编写命令,因此唯一的问题是关于ex 命令行用法.
  • 现在我更新了我的问题。请查看并提出建议。
  • 我已经尝试了您建议的代码块,但它不起作用。我正在使用 korn shell。
  • 哪个供应商实现了ex? Mine 使用 Apple 提供的 BSD 派生版本进行了测试。此外,作为一项规则,您需要提供比“不工作”更好的错误报告。不工作如何?文件没有变化?错误信息?如果是这样,什么信息?等等。
【解决方案2】:

我想你想要一个答案

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
@

现在检查测试文件。

【讨论】:

    猜你喜欢
    • 2010-10-02
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多