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 16:20:06 -0300
User-agent: Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Thunderbird/31.1.2

Ops desculpem, não tinha visto essa postagem.
Nesse caso minha idéia falha, pois perde as duas linhas AAA
seguidas, com EEE depois

sed '/AAA/ {N;s/EEE/&\nBBB\nCCC\nDDD/;}' testeComErro

Abraços Paulo Bettega

On 12-10-2014 04:26, Rodrigo Tenorio address@hidden [shell-script] wrote:
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
e
http://stackoverflow.com/questions/11024245/sed-recipe-how-to-do-stuff-between-two-patterns-that-can-be-either-on-one-line#11048145
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
<mailto:address@hidden> [shell-script] <address@hidden
<mailto: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]