From: pedromalves on
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
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
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
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
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