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