Como filtrar 2 linhas para cada linha que corresponde ao regex grep?
este é o meu teste mínimo:
SomeTestAAAA
EndTest
SomeTestABCD
EndTest
SomeTestDEFG
EndTest
SomeTestAABC
EndTest
SomeTestACDF
EndTest
E, obviamente, eu tentei, por exemplo, o grep -vA 1 SomeTestAA
que não funciona.
a saída desejada é:
SomeTestABCD
EndTest
SomeTestDEFG
EndTest
SomeTestACDF
EndTest
text-processing
grep
Behrooz
fonte
fonte
Respostas:
Você pode usar
grep
com-P
(PCRE):(?!AA)
é o padrão de lookahead negativo de largura zero, garantindo que não hajaAA
depoisSomeTest
.Teste :
fonte
\.
sogrep -P -A 1 'SomeTest\.(?!AA)' file.txt
orgrep -P -A 1 'SomeTest(?!\.AA)' file.txt
SomeTest*\nEndTest
para que você efetivamentegrep
execute ping em todas as linhas correspondentes,SomeTest*
mas nãoSomeTestAA
+ uma linha de contexto após a correspondência. Adicione mais algumas linhas à entrada (por exemplo, adicione uma linhafoobar
após cadaEndTest
linha) e tente novamente.Aqui está uma
sed
solução (-n
ou seja, sem impressão automática) que funciona com entrada arbitrária:então com uma entrada como
corrida
saídas
isto é, remove exatamente as linhas que
grep -A1 SomeTestAA infile
selecionariam:fonte
//
correspondia/SomeTestAA/
. Eu pensei que, neste caso, teria correspondido a expressão negada:/SomeTestAA/!
. (+1)!
não faz parte do ER , é umased
coisa.Você pode ter melhor sorte com algo que considera as regiões com várias linhas como registros únicos. Há um
sgrep
que eu não usei muito.Há também awk, onde você pode definir o separador de registros de entrada e o separador de registros de saída para o que quiser.
A maior parte do programa awk é de aspas simples, mas mudo para aspas duplas no final para que a
$pat
variável shell possa ser expandida.fonte
awk -vpat="^SomeTestAA" -vRS="\nEndTest\n" 'BEGIN{ ORS=RS } $0 !~ pat' file
Uma opção é usar
p
erlc
ompatibler
egulare
xpressiongrep
:A opção
-M
permite que o padrão corresponda a mais de uma linha.fonte
grep
já suporta PCRE (via-P
opção), qual é a vantagem de usarpcregrep
?grep
não suporta-M
opção.Usando o padrão
sed
:O
sed
script analisa a linha de arquivo de entrada por linha, e quando uma linha corresponde ao padrãoSomeTestAA
, os doissed
comandos de ediçãoN
ed
são executados. ON
comando anexa a próxima linha de entrada ao espaço do padrão (o buffer quesed
pode editar) ed
exclui o espaço do padrão e inicia o próximo ciclo.fonte
Tentei com o comando Below sed e funcionou bem
comando
resultado
fonte
Você pode usar
sed
od
comando do GNU para excluir uma linha e prefixá-lo com/pat/,+N
para selecionar linhas que correspondam ao padrão e às N linhas subsequentes . No seu caso, N = 1, pois você deseja excluir a única linha subsequente após uma linha correspondente:fonte