2009-09-29 8 views
2

Я хочу избежать некоторых специальных символов внутри строки автоматически. Я подумал об эхом этой струны и протрубил ее через некоторые семечки. Кажется, что это не работает внутри backticks. Так почему жеshell: Использование sed в backticks

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

возвращение

foo\[bar] 

но

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

просто возвращает

foo[bar] 

?

В отличие от СЭД, тр прекрасно работает внутри обратных кавычек:

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

возвращает

foo-bar] 

ответ

6

Вам нужно избегать обратных косых черт между обратными окнами.

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

В качестве альтернативы, использовать $() (это на самом деле рекомендуемый метод).

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

Спасибо всем! – 2009-09-29 14:50:23

15

Как насчет не использовать кавычку, но использовать $()?

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

, если вы настаиваете на использование кавычки, я думаю, что вам нужен дополнительный побег всех \ в двойную \

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

+1 для '$()' Никогда, никогда не используйте обратные сигналы. Есть так много преимуществ использования '$()'. http://mywiki.wooledge.org/BashFAQ/082 –

+2

и +1 для комментария, ссылающегося на Bash FAQ 82 – nos

2

Как правило, это случай underescaping

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