Я использую sed для поиска и замены шаблонов в имеющихся у меня файлах SAS, а не для их индивидуального изменения. Проблема в том, что я пытаюсь заменить макропеременные, и когда я использую амперсанд, он обрабатывается неправильно.
Here's my code:
sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas
всякий раз, когда я запускаю эту команду, она кажется добавляющей и делающей всякие прикольные вещи с оригинальным текстом.
Вопрос: Как заменить текст, содержащий амперсанды, командой sed?
&
это специальный символ, поэтому его нужно экранировать при использовании в RHS - в вашем случае вам нужно бежать,'s/user=&uid./user=\&sysuserid./g'
хотя я подозреваю, что вам также нужно экранировать точку в LHS, чтобы соответствовать буквальной точке, так что вам действительно нужно's/user=&uid\./user=\&sysuserid./g'
Ответы:
&
является особенным в тексте замены: это означает «всю часть ввода, которая была сопоставлена с шаблоном», поэтому то, что вы здесь делаете, заменяетсяuser=&uidX
наuser=user=&uidXsysuserid.
. Чтобы вставить фактический амперсанд в тексте замены, используйте\&
.Другая вещь, которая выглядит неправильно, заключается в том, что
.
в шаблоне поиска обозначается любой символ (кроме новой строки), но.
в конце заменяющего текста находится буквальная точка. Если вы хотите заменить только буквальную строкуuser=&uid.
, защитите.
ее обратной косой чертой.Если вы хотите заменить какой-либо один символ и сохранить его в результате, поместите этот символ в группу и используйте
\1
в замещении для ссылки на эту группу.Фактически, учитывая повторение между исходным текстом и заменой, вы все равно должны использовать группы:
то есть «заменить
u
наsysuser
междуuser=&
иid.
».источник
\(user=&\)
шаблон, который сопоставляетuser&
и сохраняет строку соответствия как группу (группа номер 1, так как это первая группа в шаблоне). Затем в замене\1
заменяется строка, хранящаяся для группы № 1.=
в регулярных выражениях и в замещающем тексте означает сам по себе, так чтоuser=&
совпадает толькоuser=&
, аuser=&
в замещающем текстеuser=
следует часть строки, соответствующая регулярному выражению.=
Персонаж не имеет особого значения.user=&
в тексте замены выдаетсяuser=
сопровождаемый исходным сопоставленным текстом.user=\&
в тексте замены выдаетuser=&