4

I want to escape some special chars inside a string automatically. I thought of echoing that string and pipe it through some seds. This doesn't seem to work inside of backticks. So why does

echo "foo[bar]" | sed 's/\[/\\[/g'

return

foo\[bar]

but

FOO=`echo "foo[bar]" | sed 's/\[/\\[/g'` && echo $FOO

just returns

foo[bar]

?

In contrast to sed, tr works perfectly inside of backticks:

FOO=`echo "foo[bar]" | tr '[' '-' ` && echo $FOO

returns

foo-bar]
Jens
  • 69,818
  • 15
  • 125
  • 179

3 Answers3

16

How about not using backticks but use $() ?

FOO=$(echo "foo[bar]" | sed 's/\[/\\[/g') && echo $FOO

if you insist on using backticks, I think you need to extra escape all \ into double \

FOO=`echo "foo[bar]" | sed 's/\\[/\\\\[/g'` && echo $FOO
fforw
  • 5,391
  • 1
  • 18
  • 17
8

You need to escape the backslashes between the backticks.

FOO=`echo "foo[bar]" | sed 's/\\[/\\\\[/g'` && echo $FOO

Alternatively, use $() (this is actually the recommended method).

FOO=$(echo "foo[bar]" | sed 's/\[/\\[/g') && echo $FOO
Alex Barrett
  • 16,175
  • 3
  • 52
  • 51
2

Usually, it's a case of underescaping

FOO=`echo "foo[bar]" | sed 's/\[/\\\[/g'` && echo $FOO
Michael Krelin - hacker
  • 138,757
  • 24
  • 193
  • 173