2012-04-09 1 views
0

По какой-то причине мне нужно бежать вперед слэш внутри некоторой строкиСЭД странное поведение, когда выполняется внутри грависом - `

# echo "http://google.com" | sed -e 's/[/]/\\\//g' 
http:\/\/google.com 

Но когда я пытаюсь выполнить то же самое внутри` `он показывает мне:

# somevar=`echo "http://google.com" | sed -e 's/[/]/\\\//g'` 
sed: -e expression #1, char 10: unknown option to `s' 

Моей СЕПГ версия:

# rpm -q sed 
sed-4.1.5-8.el5 
+0

Я нахожу любопытным, что вам нужно бежать косую черту. Вероятно, ваша проблема может быть решена более элегантно. – tripleee

ответ

1

Это происходит потому, что внутри кавычку (аку обратных кавычек, серьезные акценты), \\ заменяется на \, прежде чем команда будет разобрана.

С Баш страницы руководства:

Когда старый стиль форма кавычка замещения используется, обратный слеш сохраняет свое буквальное значение, за исключением, когда следует $, `или \. Первая обратная кавычка, которой не предшествует обратная косая черта, завершает команду под- . При использовании формы $ (command) все символы между круглыми скобками составляют команду; ни один из них не обрабатывается специально.

Просто используйте $(...) вместо обратных кавычек, если вы на самом деле не нужны предварительно POSIX sh совместимости

somevar=$(echo "http://google.com" | sed -e 's/[/]/\\\//g') 

Я также рекомендую использовать регулярное выражение разделителя, кроме /, чтобы сделать это проще, например,

somevar=$(echo "http://google.com" | sed -e 's|/|\\/|g') 
+0

'$ (...)' - оболочка POSIX; это более старые оболочки pre-POSIX, о которых, возможно, стоит беспокоиться. Но в любом случае это не связано с проблемой; пример * first * является странным, 'sed' обычно не позволяет' [] 'избегать его разделителя регулярных выражений. – geekosaur

+0

@geekosaur Спасибо, я этого не знал. Меня всегда поражает, как многие люди * все еще используют backticks, несмотря на то, как долго '$ (...)' был доступен. – je4d

+0

wow это объясняет многое. Спасибо! – Alex

0

Используйте другой разделитель, и все будет хорошо. Я не могу сказать вам, почему он работает из командной строки, но просто исправьте его, чтобы он работал повсюду.

somevar=`echo "http://google.com" | sed -e 's%[/]%\\/%g'` 
+0

он не работает, $ somevar заканчивается с 'http: // google.com', вам все равно придется скрывать строку снова, как я сказал в своем ответе – KurzedMetal

+0

Нет, вам просто нужно процитировать ее правильно при ее использовании. – tripleee

0

Вы должны снова избежать строки.

$ echo `echo \x` # tilde is executing "echo x" 
x 
$ echo `echo \\x` # tilde is executing "echo \x" 
x 
$ echo `echo \\\x` # tilde is executing "echo \\x" 
\x 

В вашем случае вы должны добавить 2 дополнительных слэш

$ echo `echo "http://google.com" | sed -e 's/[/]/\\\\\//g'` 
http:\/\/google.com 
+0

Или добавьте правильное цитирование. Как общий комментарий, используя 'echo', чтобы увидеть фактическое значение, если переменная не рекомендуется, но, как минимум, вы должны использовать правильное цитирование (т. Е. Двойные кавычки). – tripleee

+0

Это был пример, чтобы показать, почему его код не работал, я бы сделал это точно так же, как это делал je4d в его втором примере. Он спросил о странном поведении, а не о том, как это сделать правильно. – KurzedMetal

 Смежные вопросы

  • Нет связанных вопросов^_^