&
является особенным в тексте замены: это означает «всю часть ввода, которая была сопоставлена с шаблоном», поэтому то, что вы здесь делаете, заменяется user=&uidX
на user=user=&uidXsysuserid.
. Чтобы вставить фактический амперсанд в тексте замены, используйте \&
.
Другая вещь, которая выглядит неправильно, заключается в том, что .
в шаблоне поиска обозначается любой символ (кроме новой строки), но .
в конце заменяющего текста находится буквальная точка. Если вы хотите заменить только буквальную строку user=&uid.
, защитите .
ее обратной косой чертой.
sed -e 's/user=&uid\./user=\&sysuserid./g'
Если вы хотите заменить какой-либо один символ и сохранить его в результате, поместите этот символ в группу и используйте \1
в замещении для ссылки на эту группу.
sed -e 's/user=&uid\(.\)/user=\&sysuserid\1/g'
Фактически, учитывая повторение между исходным текстом и заменой, вы все равно должны использовать группы:
sed -e 's/\(user=&\)u\(id\.\)/\1sysuser\2/g'
то есть «заменить u
на sysuser
между user=&
и id.
».
&
это специальный символ, поэтому его нужно экранировать при использовании в RHS - в вашем случае вам нужно бежать,'s/user=&uid./user=\&sysuserid./g'
хотя я подозреваю, что вам также нужно экранировать точку в LHS, чтобы соответствовать буквальной точке, так что вам действительно нужно's/user=&uid\./user=\&sysuserid./g'