4 votes

Grep - exclure une chaîne qui n'est pas une sous-chaîne d'une chaîne

J'explique mon problème sur Ubuntu 16.04 avec l'exemple suivant : Le fichier est :

# cat file
aaa
aaaxxx
aaaxxx*aaa
aaa=aaaxxx
bbbaaaccc
aaaddd/aaaxxx

Je veux afficher toutes les lignes qui contiennent aaa mais pas dans la seule combinaison de aaaxxx. Je veux un résultat comme ceci :

# grep QUELQUECHOSE-ICI fichier …
aaa
aaaxxx*aaa (le deuxième aaa est trouvé)
aaa=aaaxxx (le premier aaa est trouvé)
bbbaaaccc (aaa dans n'importe quelle autre combinaison mais pas aaaxxx)
aaaddd/aaaxxx (similaire au dessus)

J'ai essayé des choses comme grep -v aaaxxx fichier | grep aaa ce qui donne :

aaa
bbbaaaccc

ou

# egrep -P '(?

``

Y a-t-il une (simple) possibilité ? Bien sûr, cela ne doit pas nécessairement être grep. Merci

``

6voto

steeldriver Points 118154

Il est facile d'utiliser un opérateur d'anticipation de style perl - disponible dans le mode d'expression rationnelle compatible avec Perl (PCRE) de grep en utilisant l'option -P:

$ grep -P 'aaa(?!xxx)' file
aaa
aaaxxx*aaa
aaa=aaaxxx
bbbaaaccc
aaaddd/aaaxxx

(le format en gras dans la sortie indique les parties correspondantes surlignées par grep)


Bien que l'anticipation de longueur nulle soit pratique, vous pouvez obtenir la même sortie en utilisant la syntaxe d'Expression Rationnelle Étendue (ERE) GNU, par exemple en faisant correspondre aaa suivi d'au plus 2 caractères x suivi d'un caractère non-x ou de la fin de la ligne, c'est-à-dire

grep -E 'aaax{0,2}([^x]|$)' file

ou même en utilisant la syntaxe d'expression régulière de base GNU (BRE)

grep 'aaax\{0,2\}\([^x]\|$\)' file

qui correspondent comme

aaa
aaaxxx*aaa
aaa=aaaxxx
bbbaaaccc
aaaddd/aaaxxx

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X