Solved

calling perl to do search/replace from a bash script

Posted on 2008-10-28
9
504 Views
Last Modified: 2013-12-26
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
Comment
Question by:Jm2005
  • 4
  • 4
9 Comments
 
LVL 84

Expert Comment

by:ozo
ID: 22826080
TOREPLACEFNL="s/<description>"$TOREPLACE"\."$COUNTER"<\/description>/<description>"$NEWDESC"<\/description>/g"
0
 
LVL 48

Expert Comment

by:Tintin
ID: 22826135
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
 

Author Comment

by:Jm2005
ID: 22826142
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
 

Author Comment

by:Jm2005
ID: 22826171
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
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 

Author Comment

by:Jm2005
ID: 22826184
on those lines which cause issues with the replace... i get the following error:

Substitution replacement not terminated at -e line 1.
0
 

Author Comment

by:Jm2005
ID: 22826202
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
 
LVL 84

Assisted Solution

by:ozo
ozo earned 500 total points
ID: 22826357
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
 
LVL 84

Assisted Solution

by:ozo
ozo earned 500 total points
ID: 22826377
TOREPLACEFNL="s/<description>"$TOREPLACE"\."$COUNTER"<\/description>/<description>$NEWDESC<\/description>/g"
0
 
LVL 84

Accepted Solution

by:
ozo earned 500 total points
ID: 22826438
perl -p -i -e "$TOREPLACEFNL" $XML
0

Featured Post

How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

Join & Write a Comment

Over the years I've spent many an hour playing on hardened, DMZ'd servers, with only a sub-set of the usual GNU toy's to keep me company; frequently I've needed to save and send log or data extracts from these server back to my PC, or to others, and…
Checking the Alert Log in AWS RDS Oracle can be a pain through their user interface.  I made a script to download the Alert Log, look for errors, and email me the trace files.  In this article I'll describe what I did and share my script.
Learn several ways to interact with files and get file information from the bash shell. ls lists the contents of a directory: Using the -a flag displays hidden files: Using the -l flag formats the output in a long list: The file command gives us mor…
The viewer will learn how to count occurrences of each item in an array.

708 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now