在bash脚本中运行vi并执行vi命令以编辑另一个文件

时间:2014-02-25 12:53:50

标签: bash shell terminal editor vi

所以我制作了一个从许多不同文件中收集数据的脚本:

#!/bin/bash

mkdir DATAPOOL"$1"

grep achi *out>runner
grep treat *out>>runner

cat runner | grep Primitive *gout | grep '=   '|awk '{print $1,$6}' > CellVolume"$1".txt 
cat runner | grep ' c ' *gout | grep 'Angstrom   '|awk '{print $1,$3}' > Cellc"$1".txt 
cat runner | grep 'Final energy ' *gout |awk '{print $1,$5}' > CellEnergy"$1".txt

等等

cat runner |awk '{print "~/xtlanal",$1," > ",$1}' >runner2
vi runner2
:1,$s/gout:/xtl/
:1,$s/gout:/dat/
:wq

source runner2

grep Summary *dat | grep 'CAT-O  ' |awk '{print $1,$6}' > AVE_NaO_"$1".txt

mv *txt DATAPOOL"$1"

所以我在没有vi部分的情况下运行时会得到所有必需的文本文件,因此我知道它一切正常。此外,当我使用vi命令运行它时,它只是停止在vi命令运行,然后我可以手动输入3个命令,我最终得到了正确的结果。我正在努力的是我不能让vi自己运行命令,所以我可以在不同的目录中多次执行该文件,而不必一次又一次地手动输入命令。

非常感谢任何帮助。

干杯

3 个答案:

答案 0 :(得分:7)

对于脚本编辑任务,您可以使用ed代替vi:

ed runner2 <<'END'
1,$s/gout:/xtl/
1,$s/gout:/dat/
w
q
END

对于全局面向行的搜索和替换,sed是一个不错的选择:

sed -i 's/gout:/xtl/; s/gout:/dat/' runner2

答案 1 :(得分:7)

类似于bash脚本:

#!/bin/bash
vi filename.txt -c ':g/^/m0' -c ':wq'

其中-c执行命令。这里的命令是反转文本文件中的行。完成后,:wq保存并退出。 (男人vi得到更多关于-c)

答案 2 :(得分:1)

在 VIM 上测试 - Vi IMproved 8.0(2016 年 9 月 12 日,编译 2018 年 4 月 10 日 21:31:58)

vi -c "g/^/m0 | wq" filename.txt 可能看起来有效,但实际上并没有!

输入 vi -c "g/^/m0 | wq" filename.txt 将导致 vi 在对文件进行任何重大更改之前写入并退出。 (在这种情况下使用管道将尝试逐行执行 wq 迫使它在预期操作之前退出)

为了观看演示,请尝试在没有 q 的情况下输入它,看看它逐行书写的速度有多慢:

vi -c "g/^/m0 | w" filename.txt

更有效的方法是使用 -c 作为 B. Kocis 声明,或者使用 +。

正如 B. Kocis 所说:

#!/bin/bash
vi filename.txt -c ':g/^/m0' -c ':wq'

vi filename.txt +g/^/m0 +wq