Comment grep -v et aussi exclure la ligne suivante après le match?

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