如何在shell脚本中使用vi命令?

时间:2016-06-02 05:56:16

标签: shell vi

我正在使用CentOS 6.7

我希望用vi打开test.txt并插入文本“hihi” 然后保存并退出vi。

"rxjs": "^5.0.0-beta.8",

结果如下

#! /bin/bash

vi test.txt << 'END'
i
hihi
press ESC
w
q
END

我该如何解决?

5 个答案:

答案 0 :(得分:1)

你不需要使用vi这么简单。您可以使用echo。例如:

echo "hihi" > test.txt

如果您真的想要做一些更复杂的事情,请发布更多细节。

答案 1 :(得分:1)

从bash调用vim:

vim test.txt +$'i\nhihi' +w +q

您可能还想查看“ed”。这是一个与vi类似命令的编辑器,但它实际上是为从脚本调用而设计的。

答案 2 :(得分:0)

有多种方法可以创建或修改文本文件,范围从any()catsedawk。不过,我会假设你有充分的理由想要使用ed

尝试此命令:

vi

在操作中,这看起来像:

echo $'ihihi\E:x\n' | vi test.txt

我发现这种方法很脆弱:如果$ echo $'ihihi\E:x\n' | vi test.txt Vim: Warning: Input is not from a terminal $ cat test.txt hihi 遇到错误情况,则不会看到任何消息。

如何运作

我们需要让vi看到转义字符。有很多方法可以做到这一点。我选择使用bash的vi字符串,因为它允许将escape作为简单的两个字符串输入:$'...'。我们使用的步骤是:

  1. \E介绍插入模式。

  2. 将四个字符i输入缓冲区。

  3. 退出hihi,退出插入模式。

  4. \E退出并保存。

答案 3 :(得分:0)

vi具有历史性的旧编辑器ex visual 模式,是旧版ed的扩展版本。您始终可以使用exvi -e恢复旧线路模式。

这样,它只是从标准输入中读取,因此可以很容易地在bash脚本中使用。

这将是

ex test.txt << END
i
hihi
.
wq
END

(点用于退出线模式的输入模式,如ed

答案 4 :(得分:0)

在 shell 中使用 vi 命令的工作方式如下:

vi -c "set fileformat=unix | wq" filename.txt

但是,这不适用于 g 之类的命令。

您需要使用两个 -c 参数才能使其工作,例如:

vi -c g/^/m0 -c wq filename.txt

vi filename.txt -c g/^/m0 -c wq

快乐编码!


P.S. 在您使用的情况下:

vi test.txt +$'i\nhihi' +wq

这将在内存中的当前行之前插入!

例如,如果您之前使用此命令在第 20 行之前插入了“hihi”:

vi test.txt +20$'i\nhihi' +wq     (insert hihi before line 20)

vi test.txt +20$'a\nhihi' +wq     (insert hihi after line 20)

然后输入不指定数字将使用内存中的最后一个数字。

vi test.txt +$'i\nhihi' +wq     (This command will now insert before line 20)

vi test.txt +$'a\nhihi' +wq     (This command will now insert after line 20)

您必须通过指定新编号来重置内存中的行号:

vi test.txt +0$'i\nhihi' +wq          (add hihi before line 0 to very top)
vi test.txt +0$'a\nhihi' +wq          (add hihi after line 0 to very top)
vi test.txt +1$'i\nhihi' +wq          (add hihi before line 1 to very top)
vi test.txt +1$'a\nhihi' +wq          (add hihi after line 1 as line 2)

如果不知道 test.txt 中的最后一行数,可以使用 wc 计算行数。

(在最后一行前加上 hihi)

vi test.txt +$(wc -l < test.txt)$'i\nhihi' +wq

(在最后一行后添加 hihi)

vi test.txt +$(wc -l < test.txt)$'a\nhihi' +wq