Você pode fazer isso:
cat test.txt | grep -A2 "pen test/ut" | sed "1 d"
The sixth line
The seventh line
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
Você pode fazer isso:
cat test.txt | grep -A2 "pen test/ut" | sed "1 d"
The sixth line
The seventh line
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
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
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
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
Tags python text-processing perl sed