Como remover um certo número de linhas sempre que uma string específica é encontrada no arquivo

0

Eu quero remover 1 linha anterior e 10 linhas seguintes toda vez que uma string for encontrada no arquivo.

foo.txt :

} Name: john Line 3 Line 4 Line 5 Line 6 Line 7 Line 8 Line 9 Line 10 Line 11 Line 12 Apple orange grape pine } Name: Ruben Line Line Line Line Line Line Line Line Line Line grape zebra donkey } Name: Tom Line Line Line Line Line Line Line Line Line Line Tiger red blue orange tomato cat }

Desejado Out.txt :

Name: john Apple orange grape pine Name: Ruben grape zebra donkey Name: Tom Tiger red blue orange tomato cat

Eu quero usar sed ou nawk . O suporte da flor e as próximas 10 linhas após o Nome: devem desaparecer. Usando o Solaris 5.10 com ksh .

    
por ayrton_senna 11.06.2015 / 21:46

1 resposta

2

Usando o awk

$ awk '/}/{next;} /Name:/{print;n=NR+10} NR>n' file
Name: john
Apple
orange
grape
pine
Name: Ruben
grape
zebra
donkey
Name: Tom
Tiger
red
blue
orange
tomato
cat

Como funciona

  • /}/{next;}

    Ignorar qualquer linha que contenha } .

  • /Name:/{print;n=NR+10}

    Quando chegarmos a uma linha contendo Name: , imprima-a e, para sabermos quando começar a imprimir novamente, defina n para 10 mais o número da linha atual.

  • NR>n

    Se o número da linha atual for maior que n , faça a ação padrão: imprima a linha.

Usando sed

Com uma lógica muito semelhante:

$ sed -e '/}/d' -e '/Name:/{p;N;N;N;N;N;N;N;N;N;N;d;}' file
Name: john
Apple
orange
grape
pine
Name: Ruben
grape
zebra
donkey
Name: Tom
Tiger
red
blue
orange
tomato
cat

Como funciona

  • /}/d

    Exclua qualquer linha contendo } .

  • /Name:/{p;N;N;N;N;N;N;N;N;N;N;d;}

    Se encontrarmos uma linha contendo Name: , imprima-a, leia as próximas 10 linhas e exclua-as.

As linhas que não se enquadram nas categorias acima são impressas.

    
por 11.06.2015 / 22:07

Tags