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

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

Re: [shell-script] SED: Inserir linhas entre dois paterns.


From: Paulo Bettega
Subject: Re: [shell-script] SED: Inserir linhas entre dois paterns.
Date: Sun, 12 Oct 2014 12:14:41 -0300
User-agent: Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Thunderbird/31.1.2

Olá Rodrigo, veja se ajuda

cat teste
LINHAS
LINHAS
AAA
BBB
LINHAS
AAA
EEE
LINHAS
LINHAS
LINHAS

sed '/AAA/ {N;s/EEE/&\nBBB\nCCC\nDDD/;}' teste
LINHAS
LINHAS
AAA
BBB
LINHAS
AAA
EEE
BBB
CCC
DDD
LINHAS
LINHAS
LINHAS

Abraços Paulo Bettega


On 11-10-2014 21:46, Rodrigo Tenorio address@hidden [shell-script] wrote:
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]