2016-02-03 2 views

ответ

3

\ не является оптимальным выбором для замены разделителя – / часто используется, и гораздо лучше подходит в данном случае, поскольку \ используется для выхода:

sed 's/cat/\&quo;cat\&quo;/' file 

Обратите внимание, что вы не должны использовать cat для подключения к sed; просто введите входной файл в качестве аргумента.

& необходимо убежать, чтобы получить буквальный текст. &; в противном случае, он стоит для всей согласованной части шаблона (см manual):

$ sed 's/XXX/~&~/' <<< 'aaaXXXaaa' 
aaa~XXX~aaa 
$ sed 's/XXX/~\&~/' <<< 'aaaXXXaaa' 
aaa~&~aaa 
+0

вы можете объяснить, почему '' & голец требует побега. –

+0

@glennjackman А, да, я сделаю это. О.П знал, что в этом есть что-то особенное. –

0

символов, которые нужно избежать различны в Bourne или POSIX оболочки, чем Bash. Обычно (очень) Bash является надмножеством этих оболочек, поэтому все, что вам нужно в shell, должно быть экранировано в Bash.

Хорошим общим правилом было бы «если в сомнении, избегайте его». Но избежать некоторых символов дает им особое значение, например \n. Они перечислены на страницах man bash под Quoting и echo.

Кроме этого, избегайте любого символа, который не является буквенно-цифровым, это безопаснее. Я не знаю ни одного окончательного списка.

Страницы руководства перечисляют их все где-то, но не в одном месте. Изучите язык, это способ быть уверенным.

Тот, кто меня поймал, это !. Это особый символ (расширение истории) в Bash (и csh), но не в оболочке Korn. Даже echo "Hello world!" дает проблемы. Использование одиночных кавычек, как обычно, устраняет особое значение.

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