From: pedromalves on 24 Aug 2006 10:11 I'm trying to do search/replace on multiple text files. I'm using the following script: #!/bin/sh USAGE=`basename $0` USAGE=$USAGE' <PATTERN> <SUBSTITUTE> <FILES PATH>' if test $# -lt 3 then echo "-I-: $USAGE" exit 1 fi PATTERN=$1 shift SUBSTITUTION=$1 shift for i; do mv $i $i.old; sed -e 's/$PATTERN/$SUBSTITUTION/g' $i.old > $i; done \rm *.old What happens is that if I echo the commands out to the shell and execute them, the replacement will occur as expect. If I run to script to execute the sed command, the resulting output will not have any change. Can someone please help me understand this? Thanks in advance, Pedro Alves
From: Bill Marcum on 24 Aug 2006 11:08 On 24 Aug 2006 07:11:52 -0700, pedromalves(a)gmail.com <pedromalves(a)gmail.com> wrote: > I'm trying to do search/replace on multiple text files. > I'm using the following script: > > #!/bin/sh > USAGE=`basename $0` > USAGE=$USAGE' <PATTERN> <SUBSTITUTE> <FILES PATH>' > if test $# -lt 3 > then > echo "-I-: $USAGE" > exit 1 > fi > PATTERN=$1 PATTERN="$1" > shift > SUBSTITUTION=$1 SUBSTITUTION="$1" > shift > for i; > do > mv $i $i.old; mv "$i" "$i.old" > sed -e 's/$PATTERN/$SUBSTITUTION/g' $i.old > $i; > done > \rm *.old > > What happens is that if I echo the commands out to the shell and > execute them, the replacement will occur as expect. If I run to script > to execute the sed command, the resulting output will not have any > change. > > Can someone please help me understand this? > Variables are not substituted inside single quotes! sed -e "s/$PATTERN/$SUBSTITUTION/g" $i.old > $i;
From: Xicheng Jia on 24 Aug 2006 11:16 pedromalves(a)gmail.com wrote: > I'm trying to do search/replace on multiple text files. > I'm using the following script: > > #!/bin/sh > USAGE=`basename $0` > USAGE=$USAGE' <PATTERN> <SUBSTITUTE> <FILES PATH>' > if test $# -lt 3 > then > echo "-I-: $USAGE" > exit 1 > fi > PATTERN=$1 If you are going to pick arbitrary PATTERN/SUBSTITION, better escape the delimiter which will be used in the later sed command, i.e. the slash in the following example: PATTERN=$(printf "%s" $1 | sed 's#/#\\/#g') similar to the other variable. > shift > SUBSTITUTION=$1 > shift > for i; > do This 'for' loop looks problematic, i.e. where did you increment the value of i? how about change this structure to be like: while [ $# -ne 0 ] do #do stuff on $1 shift done > mv $i $i.old; > sed -e 's/$PATTERN/$SUBSTITUTION/g' $i.old > $i; change your sed line to be enclosed by double-quotes: sed -e "s/$PATTERN/$SUBSTITUTION/g" $i.old > $i; Xicheng
From: Chris F.A. Johnson on 24 Aug 2006 19:09 On 2006-08-24, Bill Marcum wrote: > On 24 Aug 2006 07:11:52 -0700, pedromalves(a)gmail.com > <pedromalves(a)gmail.com> wrote: >> I'm trying to do search/replace on multiple text files. >> I'm using the following script: >> >> #!/bin/sh >> USAGE=`basename $0` >> USAGE=$USAGE' <PATTERN> <SUBSTITUTE> <FILES PATH>' >> if test $# -lt 3 >> then >> echo "-I-: $USAGE" >> exit 1 >> fi >> PATTERN=$1 > PATTERN="$1" That doesn't make any difference. >> shift >> SUBSTITUTION=$1 > SUBSTITUTION="$1" Ditto. >> shift >> for i; >> do >> mv $i $i.old; > mv "$i" "$i.old" >> sed -e 's/$PATTERN/$SUBSTITUTION/g' $i.old > $i; >> done >> \rm *.old >> >> What happens is that if I echo the commands out to the shell and >> execute them, the replacement will occur as expect. If I run to script >> to execute the sed command, the resulting output will not have any >> change. >> >> Can someone please help me understand this? >> > Variables are not substituted inside single quotes! > sed -e "s/$PATTERN/$SUBSTITUTION/g" $i.old > $i; That does. -- Chris F.A. Johnson, author <http://cfaj.freeshell.org> Shell Scripting Recipes: A Problem-Solution Approach (2005, Apress) ===== My code in this post, if any, assumes the POSIX locale ===== and is released under the GNU General Public Licence
From: Bill Marcum on 24 Aug 2006 16:16 On 24 Aug 2006 08:16:38 -0700, Xicheng Jia <xicheng(a)gmail.com> wrote: >> for i; >> do > > This 'for' loop looks problematic, i.e. where did you increment the > value of i? > 'for i' is equivalent to 'for i in "$@"' -- "Nominal fee". What an ugly sentence. It's one of those things that implies that if you have to ask, you can't afford it. -- Linus Torvalds
|
Pages: 1 Prev: export var in case statement Next: Run a PL SQL Package from a shell script |