• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 515
  • Last Modified:

calling perl to do search/replace from a bash script

i wrote a small bash script to do a mass search/replace using 2 files...

$DESC is the file with the labels to put in the destination file
$XML is the destination file (the file with the entries that need to be replaced therein)

i have it echoing the regex line to stdout for diagnostic purposes and it looks like this on the first item:
toreplaceinfal: 's/<description>ifAdminStatus\.1<\/description>/<description>ETech<\/description>/g'


if i take the 's/<description> and prepend a perl -p -i -e on the ordinary shell, it works fine, but it doesnt work from within the script...

DESC=change
XML=go
NR=0
TOREPLACE="ifAdminStatus"
 
# Grab all the descriptions, count them, then correspond fo the second file #
        for i in `seq 1 1`;
        do
                NR=`expr $NR + 1`
                NRP="$NR"p
                sed -n "$NR"p $XML | grep "<description>" > /dev/null
                COUNTER=`expr $COUNTER + 1`
                NEWDESC=`sed -n "$COUNTER"p "$DESC"`
                TOREPLACE1="$TOREPLACE"$COUNTER
                TOREPLACEFNL="'s/<description>"$TOREPLACE"\."$COUNTER"<\/description>/<description>"$NEWDESC"<\/description>/g'"
                echo "toreplace1: $TOREPLACE1"
                echo "newdesc: $NEWDESC"
                echo "XML: $XML"
                echo "toreplaceinfal: $TOREPLACEFNL"
#               read BUF1
                perl -p -i -e $TOREPLACEFNL $XML

Open in new window

0
Jm2005
Asked:
Jm2005
  • 4
  • 4
3 Solutions
 
ozoCommented:
TOREPLACEFNL="s/<description>"$TOREPLACE"\."$COUNTER"<\/description>/<description>"$NEWDESC"<\/description>/g"
0
 
TintinCommented:
BTW, what's the logic of

for i in `seq 1 1`

when that's a long hand way of writing

for i in 1

0
 
Jm2005Author Commented:
okay, that worked!

one last piece of this....

some of the lines are either blank, or have text which may screw the regex up (in $newdesc) how to fix?
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
Jm2005Author Commented:
tintin: the logic of that the loop needs to run multiple times, (428 in this instance) once i get the proc debugged, i'll adjust the loop accordingly.
0
 
Jm2005Author Commented:
on those lines which cause issues with the replace... i get the following error:

Substitution replacement not terminated at -e line 1.
0
 
Jm2005Author Commented:
below is the syntax of the regex, and the error.
newdesc: Lake Placid Point to Point
XML: go
toreplaceinfal: s/<description>ifAdminStatus\.161<\/description>/<description>Connection to Lake Placid Point to Point<\/description>/g
Substitution replacement not terminated at -e line 1.

Open in new window

0
 
ozoCommented:
If I'm understanding what you're doing,  this is probably easier to write as
DESC=change
XML=go
NR=0
TOREPLACE="ifAdminStatus"
perl -i.bak -pe 'BEGIN{chomp(@n=<STDIN>)}s/(<description>)'$TOREPLACE'\.(\d+)(<\/description>)/$1$n[$2-1]$3/g' <$DESC $XML
0
 
ozoCommented:
TOREPLACEFNL="s/<description>"$TOREPLACE"\."$COUNTER"<\/description>/<description>$NEWDESC<\/description>/g"
0
 
ozoCommented:
perl -p -i -e "$TOREPLACEFNL" $XML
0

Featured Post

Hire Technology Freelancers with Gigs

Work with freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely, and get projects done right.

  • 4
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now