O e comercial na peça de substituição é como causar sua preocupação. Um Ampersand na peça de substituição é substituído pelo texto que corresponde ao padrão. Um exemplo:
$ before="time&again"
$ after="to&fro"
$ sed "s/$before/$after/" <<END
> hello
> world time&again !
> END
hello
world totime&againfro !
Assim, o texto correspondente time&again
é substituído por to&fro
, exceto que o &
entre "to" e "fro" é substituído pelo texto correspondente.
A solução é escapar do "e" comercial no lado de substituição. Usar substituição de parâmetro bash fornecerá os resultados desejados:
sed "s/$before/${after//&/\&}/"