|
|
|
|
||||||
| comp.unix.shell Using and programming the Unix shell. |
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 (permalink) |
|
Messages: n/a
Hébergeur: |
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 me understand this? Thanks in advance, Pedro Alves |
|
|
|
#2 (permalink) |
|
Messages: n/a
Hébergeur: |
On 24 Aug 2006 07:11:52 -0700, pedromalves@gmail.com
<pedromalves@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 me understand this? > Variables are not substituted inside single quotes! sed -e "s/$PATTERN/$SUBSTITUTION/g" $i.old > $i; |
|
|
|
#3 (permalink) |
|
Messages: n/a
Hébergeur: |
pedromalves@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 |
|
|
|
#4 (permalink) |
|
Messages: n/a
Hébergeur: |
On 24 Aug 2006 08:16:38 -0700, Xicheng Jia
<xicheng@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 |
|
|
|
#5 (permalink) |
|
Messages: n/a
Hébergeur: |
On 2006-08-24, Bill Marcum wrote:
> On 24 Aug 2006 07:11:52 -0700, pedromalves@gmail.com > <pedromalves@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 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 |
|
![]() |
| Outils de la discussion | |
|
|