user3144035 user3144035 - 17 days ago 6
Bash Question

Running vi within a bash script and executing vi commands to edit another file

So I've made a script which is collecting data from many different files:

#!/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


etc etc

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"


So I end up with all the required text files when run without the vi part and so I know it all works. Furthermore when I run it with the vi commands, it just stops running at the vi command and then i can manually enter the 3 commands and I end up with the correct results. What I'm struggling with is I cant get vi to run the commands on its own so I can just execute the file multiple times within different directories and not have to manually enter commands time and time again.

Any help would be greatly appreciated.

Cheers

Answer

For scripted editing tasks, you can use ed instead of vi:

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

For global line-oriented search and replace, sed is a good choice:

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