Search code examples
bashshellterminaleditorvi

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


Solution

  • 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