O comando sed a\
interpreta as fugas, então você precisa duplicar as barras invertidas na string que você está interpolando. Tente isto:
sed -e "5a\
$(echo -E "$text" | sed -e 's/\/\\/g')"
Atualmente eu uso:
sed -i -e "5a\
${text}" $filename
para acrescentar algo a uma determinada linha, em que o texto da variável contém uma string como "\ epsilon".
Ao usar
echo -E $text
a string é exibida bem, mas quando eu a expandi na string
Eu passo para sed
, todos os caracteres de escape são expandidos e o resultado é
não é o que eu quero.
Como posso obter sed para usar o conteúdo bruto dessa string sem escapando de alguma coisa?
As citações são complicadas. Eu recomendo usar uma ferramenta que não exige que você adicione outras citações, como awk ou perl. Essas duas ferramentas permitem passar parâmetros na linha de comando ou pelo ambiente e usá-los em manipulações de texto. Com Perl:
export text
perl -i -pe '$_ .= "$ENV{text}\n" if $. == 5' "$filename"
Com o awk, você precisa mover o arquivo manualmente:
tmp=$(TMPDIR=$(dirname -- "$filename") mktemp)
awk -v text="$text" '{print} NR==5 {print text}' <"$filename" >"$tmp" &&
mv -- "$tmp" "$filename"
Você geralmente pode aplicar escape com printf "%q"
, tente isto:
text='\epsilon'
echo -e "$text"
silon
com %q
:
text=$(printf "%q" '\epsilon')
echo -e "$text"
\epsilon
Como não sou um mestre sed, acho mais fácil explicar com eco.
Use aspas simples em vez de aspas duplas.
exemplo1:
echo "one\two"
one\two
exemplo2:
echo 'one\two'
one\two
Então, usando o método example2, você não precisa escapar de nada. A string dentro daspas simples \ t \ r \ i \ n \ g 'é interpretada como é. (O caractere \ não funciona como um caractere de escape)
fonte: um