Comment filtrer 2 lignes pour chaque ligne correspondant à l'expression rationnelle 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
ce qui ne fonctionne pas.
la sortie souhaitée est:
SomeTestABCD
EndTest
SomeTestDEFG
EndTest
SomeTestACDF
EndTest
text-processing
grep
Behrooz
la source
la source
Réponses:
Vous pouvez utiliser
grep
avec-P
(PCRE):(?!AA)
est le motif d'anticipation négatif de largeur nulle garantissant qu'il n'y a pas d'AA
aprèsSomeTest
.Test:
la source
\.
sogrep -P -A 1 'SomeTest\.(?!AA)' file.txt
orgrep -P -A 1 'SomeTest(?!\.AA)' file.txt
SomeTest*\nEndTest
, vous effectuez donc une commandegrep
ping sur toutes les lignes correspondantes,SomeTest*
mais pasSomeTestAA
+ une ligne de contexte après la correspondance. Ajoutez quelques lignes supplémentaires à l'entrée (par exemple, ajoutez une lignefoobar
après chaqueEndTest
ligne), puis réessayez.Voici une
sed
solution (sans-n
aucune impression automatique) qui fonctionne avec une entrée arbitraire:donc avec une entrée comme
fonctionnement
les sorties
c'est-à-dire qu'il supprime exactement les lignes qui
grep -A1 SomeTestAA infile
sélectionneraient:la source
//
correspondait/SomeTestAA/
. Je pensais que , dans ce cas, il aurait assorti l'expression niée:/SomeTestAA/!
. (+1)!
ne fait pas partie du RE , il est unesed
chose.Vous pourriez avoir plus de chance avec quelque chose qui considère les régions multilignes comme des enregistrements uniques. Il y en a un
sgrep
que je n'ai pas beaucoup utilisé.Il y a aussi awk, où vous pouvez définir le séparateur d'enregistrements d'entrée et le séparateur d'enregistrements de sortie, comme vous le souhaitez.
La plupart du programme awk est entre guillemets simples, mais je passe à des guillemets doubles à la fin afin que la
$pat
variable shell puisse être développée.la source
awk -vpat="^SomeTestAA" -vRS="\nEndTest\n" 'BEGIN{ ORS=RS } $0 !~ pat' file
Une option consiste à utiliser une
p
expressionc
egulairer
compatible avece
erlgrep
:L'option
-M
permet au modèle de correspondre à plus d'une ligne.la source
grep
prend déjà en charge PCRE (via l'-P
option), quel est l'avantage d'utiliserpcregrep
?grep
ne prend pas en charge l'-M
option.En utilisant la norme
sed
:Le
sed
scénario analyse la ligne du fichier d'entrée par ligne, et lorsqu'une ligne correspond au motifSomeTestAA
, les deuxsed
commandes d'éditionN
etd
sont exécutées. LaN
commande ajoute la ligne d'entrée suivante à l'espace modèle (le tampon quised
peut être modifié),d
supprime l'espace modèle et démarre le cycle suivant.la source
Essayé avec la commande ci-dessous sed et cela a bien fonctionné
commander
production
la source
Vous pouvez utiliser
sed
lad
commande GNU pour supprimer une ligne et la préfixer avec/pat/,+N
pour sélectionner les lignes correspondant au modèle et les N lignes suivantes. Dans votre cas, N = 1 car vous ne souhaitez supprimer que la ligne suivante unique après une ligne correspondante:la source