Acrescentando uma string contendo caractere de escape com sed

1

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?

    
por pmr 10.08.2012 / 13:13

4 respostas

3

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')"
    
por 10.08.2012 / 13:47
2

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"
    
por 11.08.2012 / 01:13
1

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
    
por 10.08.2012 / 15:05
-1

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

    
por 10.08.2012 / 13:39