Nico
Nico

Reputation:

shell: Using sed in backticks

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

Answers (3)

Alex Barrett
Alex Barrett

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

Michael Krelin - hacker
Michael Krelin - hacker

Reputation: 143249

Usually, it's a case of underescaping

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

Upvotes: 2

fforw
fforw

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

Related Questions