Como excluo todas as linhas de um arquivo até que ele corresponda a um padrão de linha de string? [duplicado]

0

Como posso excluir linhas em um arquivo até que ele corresponda a um padrão de linha de string?

cat test.txt
The first line
The second line
The third line
The fourth line
pen test/ut
The sixth line
The seventh line

Eu gostaria de usar o script shell / python para remover todas as linhas do arquivo acima até que ele corresponda ao padrão de string de arquivo "pen test"

Saída esperada: o arquivo "test.txt" deve ter apenas essas linhas após remover as linhas acima:

The sixth line
The seventh line
    
por itgeek 17.09.2018 / 20:19

5 respostas

0

Você pode fazer isso:

cat test.txt | grep -A2 "pen test/ut" | sed "1 d"
The sixth line
The seventh line
    
por 17.09.2018 / 20:34
0

Depois de escrever uma resposta com um script shell usando split e sed, lembrei-me do comando shell csplit (split de contexto).

Guardei o seu texto acima em /tmp/del.me. O comando:

csplit del.me "/pen test/"

divide o arquivo original em dois arquivos, um com o texto antes do jogo e outro com o texto incluindo e seguindo.

host:tmp me$ cat xx01
pen test/ut
The sixth line
The seventh line

Se você não quiser a correspondência, adicione "+1" ao argumento de correspondência e coloque o texto correspondente no primeiro arquivo.

csplit del.me "/pen test/+1"

Então, o comando acima me dá dois arquivos de saída xx00 xx01. (Você pode alterar a nomenclatura do arquivo.) Xx01 contém:

host:tmp me$ cat xx01
The sixth line
The seventh line
    
por 17.09.2018 / 21:11
0

Você pode usar os utilitários sed e Perl para fazer isso da seguinte maneira:

perl -ne '
  next unless /pen/;  #  skip till we meet the first interesting record
  print <>;           # <> in the list context, fetches the entire remaining file
' input-file.txt

sed -ne '
   /pen/!d
   n
   :loop
      $!N;P;s/.*\n//
   tloop
' input-file.txt

sed -ne '
   /pen/!d  ;# reject lines till we see the first interesting line
   n        ;# skip the first time we see the interesting line
   :n       ;# then setup a do-while loop which"ll do a print->next->print->... till eof
      p;n   ;# the looping ends when the n command tries to read past the last record
   bn
' input-file.txt
    
por 17.09.2018 / 21:37
0

com o Perl:

perl -ni.bck -e '$i++,next if /^pen test/;print if $i' file

Isto lê o seu arquivo de entrada e faz uma atualização no local. O arquivo original é preservado com uma extensão de sufixo .bck .

Conforme cada linha do arquivo é lida, um sinalizador, $i , é definido se uma linha começa com pen test e a próxima linha é lida. Quando $i não é zero (uma condição verdadeira), as linhas são impressas.

Se você quiser apenas extrair as linhas de interesse e não atualizar, basta fazer:

perl -ne '$i++,next if /^pen test/;print if $i' file
    
por 17.09.2018 / 20:44
0

Com o GNU sed: apague tudo até a primeira correspondência e modifique o arquivo no local:

sed -i '0,/pen test/d' test.txt
    
por 17.09.2018 / 22:25