[olug] sed issues inside of a script

Christopher Cashell topher-olug at zyp.org
Tue Nov 13 08:25:22 UTC 2007


On Nov 13, 2007 12:53 AM, John Hobbs <john at velvetcache.org> wrote:
> My problem lies with (I believe) sed.  I'm trying to escape a path
> with sed and store that in a variable and it isn't working with `` but
> it is with $().

Close, it's not a sed issue, but a bash issue.

> Here's my debugging demo script:

[Snip: script.]

"When the old-style backquoted form of substitution is used, backslash
retains its literal meaning except when followed by "$", "`", or "\".
The first backticks not preceded by a backslash terminates the command
substitution. When using the "$(COMMAND)" form, all characters between
the parentheses make up the command; none are treated specially."

> The output to that is:
>
> $ ./example.sh
> /home/jmhobbs/Desktop
> \/home\/jmhobbs\/Desktop
> sed: -e expression #1, char 9: unknown option to `s'
>
> \/home\/jmhobbs\/Desktop
> $

In the broken example, sed is being passed in 's/\//\\//g', instead of
's/\//\\\//g' (note the missing backslash in the latter part).

> Just curious if anyone knows why that would happen.  Am I missing
> something, I thought `` and $() were equivalent.

They're almost equivalent, but not quite 100%.  Also, using backticks
is deprecated, so best practice would be to use $() in any new scripts
that you write.

Also, if you're having trouble with shell scripts, one of the most
useful things you can do to debug is run it with -x.  Doing that
causes bash to echo the commands as they're run, along with the
results and evaluations.

For example, for this snip of your script:

THEPATH='/home/jmhobbs/Desktop'
# Won't work
ESCAPEDPATH=`echo $THEPATH | sed 's/\//\\\//g'`
echo $ESCAPEDPATH
# Will work
ESCAPEDPATH=$( echo $THEPATH | sed 's/\//\\\//g' )
echo $ESCAPEDPATH

When run with bash -x, you get the following:

topher at nexus:/tmp$ bash -x temp.sh
+ THEPATH=/home/jmhobbs/Desktop
++ echo /home/jmhobbs/Desktop
++ sed 's/\//\\//g'
sed: -e expression #1, char 9: unknown option to `s'
+ ESCAPEDPATH=
+ echo

++ echo /home/jmhobbs/Desktop
++ sed 's/\//\\\//g'
+ ESCAPEDPATH='\/home\/jmhobbs\/Desktop'
+ echo '\/home\/jmhobbs\/Desktop'
\/home\/jmhobbs\/Desktop

Here you can see the values of each expression, including the first
sed that is one backslash short of what it should be.

Hope this helps, and good luck. ;-)

> - John Hobbs

-- 
Christopher



More information about the OLUG mailing list