Se você deseja que a substituição funcione, qualquer que seja o conteúdo da variável, é necessário excluir os caracteres da variável que são especiais no lado direito de um comando s em sed , que são:
- o próprio delimitador (acima, você usou
/ )
-
& , que é substituído pela string correspondente
- nova linha que precisa ser escapada
-
\ , que é usado para escapar de todos os itens acima e introduzir , ...
Como:
escaped_var=$(printf '%s\n' "$var" | sed 's:[/&\]:\&:g;s/$/\/')
escaped_var=${escaped_var%?}
sed "s/regexp/$escaped_var/g"
Como isso é um pouco complicado, você pode usar perl :
v=$var perl -pe 's/regexp/$ENV{v}/g'
O equivalente a sed ' 2s seria:
v=$var perl -pe 's/regexp/$ENV{v}/g if $. == 2'
Embora no seu caso, é claro, você prefere escrevê-lo:
v=$myaddress perl -pe '$_ = "fname=\"$ENV{v}\"\n" if $. == 2'
A outra vantagem é que ele também funciona com dados binários e você pode usar a opção -i para edição no local enquanto com sed , você só pode fazer isso em sistemas onde sed é o GNU sed .
Observe também que o caractere NUL não pode ser armazenado em uma variável de ambiente.