Reputation:
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]
Upvotes: 4
Views: 4571
Reputation: 16475
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
Upvotes: 8
Reputation: 143249
Usually, it's a case of underescaping
FOO=`echo "foo[bar]" | sed 's/\[/\\\[/g'` && echo $FOO
Upvotes: 2
Reputation: 5491
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
Upvotes: 16