Символ &
в $varj
имеет специальное значение в части replace команды s/search/replace/
. Это означает "вставить сюда подходящий текст".
Вы можете использовать \&
для "экранирования" &
, чтобы он не имел специального значения. Вы можете использовать sed для изменения $varj
, чтобы заменить все символы &
на \&
:
varj=$(echo "$varj" | sed -e 's/\&/\\\&/g')
Например:
cas@ganesh:/tmp$ ksh
$ vari='111|abc & efg|123'
$ varj='222|abc & efg|123'
$ echo "$vari" | sed -e "s/$vari/$varj/g"
222|abc 111|abc & efg|123 efg|123
$ varj=$(echo "$varj" | sed -e 's/\&/\\\&/g')
$ echo "$varj"
222|abc \& efg|123
$ echo "$vari" | sed -e "s/$vari/$varj/g"
222|abc & efg|123