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'
# ---------------------------^
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?
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'
# ---------------------------^
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 .
Eu ia sugerir:
echo match | sed -e 's/match/\tline1\n\tline2\n&/'
Tags sed