&является особенным в тексте замены: это означает «всю часть ввода, которая была сопоставлена с шаблоном», поэтому то, что вы здесь делаете, заменяется 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'