Comment filterr 2 lignes pour chaque ligne correspondant à l'expression régulière de grep?
c'est mon test minimal:
SomeTestAAAA EndTest SomeTestABCD EndTest SomeTestDEFG EndTest SomeTestAABC EndTest SomeTestACDF EndTest
Et évidemment, j'ai essayé par exemple grep -vA 1 SomeTestAA
qui ne fonctionne pas.
la sortie souhaitée est:
SomeTestABCD EndTest SomeTestDEFG EndTest SomeTestACDF EndTest
Vous pouvez utiliser grep
avec -P
(PCRE):
grep -P -A 1 'SomeTest(?!AA)' file.txt
(?!AA)
est le motif de regard négatif de largeur nulle garantissant qu'il n'y a pas d' AA
après SomeTest
.
Test:
$ grep -P -A 1 'SomeTest(?!AA)' file.txt SomeTestABCD EndTest SomeTestDEFG EndTest SomeTestACDF EndTest
Une option consiste à utiliser p
erl c
ompatible e
xpression grep
:
pcregrep -Mv 'SomeTestAA.*\n' file
L'option -M
permet au model de correspondre à plus d'une ligne.
Vous pourriez avoir plus de chance avec quelque chose qui regarde les régions multilignes comme des loggings uniques. Il y a un sgrep
que je n'ai pas beaucoup utilisé.
Il y a aussi awk, où vous pouvez définir le séparateur d'logging d'input, et sortir le séparateur d'logging, à tout ce que vous voulez.
pat="^SomeTestAA" awk 'BEGIN{ RS=ORS="\nEndTest\n"} !/'"$pat/" foo
La plupart du programme awk est un guillemet simple, mais je change en guillemets à la fin de sorte que la variable shell $pat
peut être étendue.
Voici une solution sed
(avec -n
, printing automatique désactivée) qui devrait fonctionner avec des inputs inconnues:
sed -n '/SomeTestAA/!p # if line doesn't match, print it : m # label m //{ # if line matches $!{ # and if it's not the last line n # empty pattern space and read in the next line bm # branch to label m (so n is repeated until a } # line that's read in no longer matches) but } # nothing is printed ' infile
donc avec un file de test:
SomeTestAAXX SomeTestAAYY + one line SomeTestONE Message body EndTest ######## SomeTestTWO something here EndTest SomeTestAABC + another line SomeTestTHREE EndTest SomeTestAA + yet another line
fonctionnement
sed -n '/SomeTestAA/!p;: m;//{$!{n;bm};}' infile
les sorties
SomeTestONE Message body EndTest ######## SomeTestTWO something here EndTest SomeTestTHREE EndTest
c'est-à-dire qu'il supprime exactement les lignes que grep -A1 SomeTestAA infile
sélectionnerait:
SomeTestAAXX SomeTestAAYY + one line -- SomeTestAABC + another line -- SomeTestAA + yet another line