&
is special in the replacement text: it means “the whole part of the input that was matched by the pattern”, so what you're doing here replaces user=&uidX
with user=user=&uidXsysuserid.
. To insert an actual ampersand in the replacement text, use \&
.
Another thing that looks wrong is that .
in the search pattern stands for any character (except a newline), but the .
at the end of the replacement text is a literal dot. If you want to replace only the literal string user=&uid.
, protect the .
with a backslash.
sed -e 's/user=&uid\./user=\&sysuserid./g'
If you want to replace any one character and preserve it in the result, put the character in a group and use \1
in the replacement to refer to that group.
sed -e 's/user=&uid\(.\)/user=\&sysuserid\1/g'
In fact, given the repetition between the original text and the replacement, you should use groups anyway:
sed -e 's/\(user=&\)u\(id\.\)/\1sysuser\2/g'
i.e. “replace u
by sysuser
between user=&
and id.
”.
&
is a special character so it needs to be escaped when used in the RHS - in your case you have to run's/user=&uid./user=\&sysuserid./g'
although I suspect you also need to escape the dot in the LHS to match a literal dot so you actually need's/user=&uid\./user=\&sysuserid./g'