como formar uma expressão sed contendo caracteres de escape

4

Dada uma expressão sed (e GNU sed 4.2.2 no ArchLinux)

/match/i\tline1\n\tline2

que deve inserir duas linhas recuadas de tabulação acima da correspondência, acho que o escape do primeiro caractere (no exemplo, \t ) é ignorado, mas todos os outros caracteres de escape são tratados corretamente.

Testando isso assim:

echo match | sed -e '/match/i\tline1\n\tline2'

resulta em

tline1
    line2
match

Não importa qual é o caractere de escape inicial (por exemplo, tabulação ou nova linha), o resultado é o mesmo. Qual é a maneira correta de consertar a expressão para que o primeiro caractere seja tratado corretamente?

    
por starfry 09.05.2013 / 19:33

3 respostas

5

Verifique o manual do gnu sed ( link ) - - O comando i é realmente o comando i\ , então você só precisa de uma barra invertida extra

echo match | sed -e '/match/i\tline1\n\tline2'
# ---------------------------^
    
por 09.05.2013 / 19:47
3

A sintaxe padrão (no caso de você querer ser portável para sistemas não-GNU) é:

sed 'i\
\   line1\
line2'

Ou seja, você precisa de uma nova linha após i\ e não há nenhuma sequência de escape reconhecida (acima, o caractere de tabulação é inserido literalmente). Apenas, você precisa escapar da nova linha, dos caracteres de barra invertida e dos espaços em branco iniciais¹ com uma barra invertida.

Com shells que suportam o tipo de aspas (não padrão sh ) ksh $'...' (como ksh93 , zsh ou bash ), você pode escrevê-lo:

sed $'i\\n\\tline1\\nline2'

¹ barras invertidas não são necessárias antes de liderar espaços em branco em sed s compatível com POSIX, mas algumas implementações como em BSDs ainda retiram esses espaços em branco à esquerda sem a barra invertida .

    
por 09.05.2013 / 21:47
1

Eu ia sugerir:

 echo match | sed -e 's/match/\tline1\n\tline2\n&/'
    
por 09.05.2013 / 20:55

Tags