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: Rodrigo Tenorio
Subject: Re: [shell-script] SED: Inserir linhas entre dois paterns.
Date: Sun, 12 Oct 2014 04:26:35 -0300

Camarada,

No caso em questão, eu tenho duas linhas que não se repetem em sequência. E depois de minha edição, nunca mais ficarão uma seguida da outra.
É como se fosse dois limitadores para eu inserir coisas no meio, compreende?
Aliás, elas não podem se repetir em sequência. E se houver repetição... Hehe Vai dar muita merda para tudo quanto é lado. * batendo três vezes na madeira *
Mesmo assim, acrescentei o ":a" e "Ta" no SED aqui.

Ok, você está correto. Então suponhamos um possível cenário de erro no arquivo original:

£ cat >> testeComErro << EOT
LINHAS
LINHAS
LINHAS
AAA
BBB
LINHAS
LINHAS
AAA
AAA
EEE
LINHAS
LINHAS
AAA
EEE
LINHAS
LINHAS
AAA
CCC
EOT

Como evitar que o sed inclua as três linhas entre as duas ocorrências de "AAA" e "EEE" encontradas?
...
Depois de bater cabeça, ler o
http://unixhelp.ed.ac.uk/CGI/man-cgi?sed
cheguei na solução:

£ sed ':a;/^AAA$/{n;s/^EEE$/BBB\nCCC\nDDD\n&/;Ta;:b;$!{N;bb};q}' testeComErro

O estranho é que a estrutura geral do arquivo de entrada foi mantida. Mas repare a saída com o diff.
Em teoria, ele só deveria demonstrar a alteração entre o primeiro "AAA" seguido de "EEE". No entanto:

£ diff -y teste <(sed ':a;/^AAA$/{n;s/^EEE$/BBB\nCCC\nDDD\n&/;Ta;:b;$!{N;bb};q}' testeComErro)

Dessa vez eu fiquei sem saber se eu acertei ou errei...



Em 12 de outubro de 2014 01:18, Ronaldo Ferreira de Lima address@hidden [shell-script] <address@hidden> escreveu:
 

On Sat, Oct 11, 2014 at 11:23:48PM -0300, Jimmy Isaac Neutron wrote:
[...]
> Você pode resumir para:
>
> $ sed '/^AAA$/{n;s/^EEE$/BBB\nCCC\nDDD\n&/}' teste
Putz! Lembrei de uma caso onde essa solução irá quebrar:

AAA
BBB
AAA
AAA
EEE
AAA
AAA
AAA
EEE
AAA
CCC

Seria possível apenas ajustar a solução anterior para:

$ sed ':a;/^AAA$/{n;s/^EEE$/BBB\nCCC\nDDD\n&/;Ta}' teste

Neste caso, quando "próxima linha" após "AAA" não for "EEE", retesta o
pattern space corrente (que pode ser mais um "AAA" ou múltiplos). A
solução fica mais genérica mas não é possível afirmar que será
infalível. O ideal é avaliar o cenário que você tem e não o que acha
ter. Em muitos casos, eu primeiro crio hipóteses para testá-las contra o
input e apenas crio scripts/programas baseados nas "certezas" que os
testes forneceram sobre os dados.

[]'s
--
"Não manejo bem as palavras
Mas manipulo bem as strings."
------------------------------
http://tecnoveneno.blogspot.com



reply via email to

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