所以我做了一个脚本,从许多不同的文件中收集数据:
#!/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 自行运行命令,因此我可以在不同的目录中多次执行文件,而不必一次又一次地手动输入命令。
任何帮助将不胜感激。
干杯
像这样作为bash脚本:
#!/bin/bash
vi filename.txt -c ':g/^/m0' -c ':wq'
-c
执行命令的位置。这里的命令是反转文本文件中的行。完成后,:wq
保存并退出。(曼六以获得更多关于 -c)
如果您不想键入-c
两次,可以通过以下方式执行此操作:
vi -c "g/^/m0 | wq" filename.txt
对于脚本化编辑任务,可以使用 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
在 VIM - Vi IMproven 8.0 上测试 (2016 年 9 月 12 日,编译于 Apr 10 2018 21:31:58)
vi -c "g/^/m0 | wq" 文件名.txt可能看起来有效,但实际上并非如此!
键入 vi -c "g/^/m0 | wq" 文件名.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