shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

SED: Inserir linhas entre dois paterns.


From: Rodrigo Tenorio
Subject: SED: Inserir linhas entre dois paterns.
Date: Sat, 11 Oct 2014 21:46:44 -0300

Amigos, boa noite!

Estava redigindo o email pedindo ajuda enquanto pesquisava por uma solução.
Encontrei. Para distribuir conhecimento e registrar, envio o email.

Tenho o seguinte cenário:

cat >> teste << EOT
LINHAS
LINHAS
AAA
BBB
LINHAS
AAA
EEE
LINHAS
LINHAS
LINHAS
EOT

Preciso inserir as linhas BBB, CCC, DDD somente quando a próxima linha de AAA for EEE.
Eu consegui localizar e imprimir com:

£ sed -n "/^AAA/g;{n;/^EEE/p}" teste

Mas ao trocar o "p" para "i BBB" recebo o seguinde retorno:

£ sed -n "/^AAA/g;{n;/^EEE/i BBB}" teste
sed: -e expressão #1, caractere 0: `{' não terminada

Acreditava que se eu conseguia imprimir o EEE, eu conseguiria adicionar conteúdo antes dele.
...
Bem. Depois de muito bater cabeça, cheguei no ponto em que o sed fez o que eu precisava...

£ sed -r ":a;/^AAA/{n;/^EEE/bc};n;ba;:c;i BBB" teste

... Mas ainda faltam inserir as linhas CCC e DDD. E isso eu consegui usando "i BBB \nCCC \nDDD".

Destrinchando a coisa da maneira que entendi:
:a # marcador e início de fluxo de ER.
/^AAA/ # pesquisa pelo patern AAA que começa com um A, devido ao ^.
{
n # pula para a próxima linha.
/^EEE/ # similar ao /^AAA/.
bc # salto para o fluxo de ER "c": o "b" é o salto e o "c" é o endereço para onde ele vai saltar.
}
n # pula para a próxima linha.
ba # similar ao "bc".
:c # similar ao ":a".
i BBB # o "i" insere cadeias de caracteres, na linha imediatamente anterior à linha corrente; no caso "BBB".

É isso.
Se eu tiver entendido a coisa errado, se houver ideias complementares; ou se houver uma forma melhor de fazer isso, por favor sintam-se livres para responder.

Grande abraço,
Rodrigo Boechat

reply via email to

[Prev in Thread] Current Thread [Next in Thread]