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.