Grep. Ligne de texte qui ne se termine pas par"abcd"?

Salut, je suis à la recherche d'une expression régulière pour: ligne de texte qui ne prend pas fin avec un certain mot, disons que c'est "abcd"

J'ai d'abord essayé avec

.*[^abcd]$

Que l'un ne fonctionne pas bien sûr. Elle correspond à une ligne qui ne prend pas fin avec l'une des lettres a,b,c ou d.

Donc, dans les sujets Grep avancés, j'ai trouvé cette expression, mais je n'ai pas pu la faire fonctionner:

^(?>.*)(?<=abcd)

- >

grep -e "^(?>.*)(?<=abcd)$"

Tout idée pour l'expression dont j'ai besoin?

14
demandé sur CCC 2011-05-15 06:31:00

3 réponses

consultez L'option-v de Grep

grep -v 'abcd$'

Si vous avez vraiment signifie mot plutôt que "séquence de caractères" puis utiliser

grep -v '\babcd$'

\b ce qui signifie "limite des mots"

20
répondu tobyodavies 2011-05-15 03:06:37

Donner un coup de cette:

grep -v "\<abcd\>$"

validation de principe

$ printf "%s\n" "foo abcd bar baz" "foo bar baz abcd" "foo bar bazabcd" | grep -v "\<abcd\>$"
foo abcd bar baz
foo bar bazabcd

Remarque:: Ce match mots tel que noté par le fait que la 3ème ligne a été retournée même si elle contenait

3
répondu SiegeX 2011-05-15 02:33:25

grep supporte les expressions régulières PCRE lors de l'utilisation de -P drapeau.

l'Une des raisons grep -e "^(?>.*)(?<=abcd)$" ne fonctionne pas est parce que le regard que vous utilisez est positif, ce qui signifie totalement contraire à ce qui est nécessaire. (?<= est la syntaxe pour lookbehind positif, qui dit à regex engine de rechercher des lignes qui se termineabcd.

pour rechercher des lignes qui ne se terminent pas par une certaine chaîne, vous devez utiliser le lookbehind négatif. Le la syntaxe pour lookbehind négatif est (?<!. Et parce que lookbehind négatif inclut un point d'exclamation que bash essaiera d'interpréter comme un événement, on ne peut pas utiliser des guillemets doubles pour fournir regex à grep.

j'ai utilisé suivant regex pour rechercher les lignes qui ne se terminent pas par log.

grep -P '(?<!log)$' < <inputfile>

de Même, vous pouvez utiliser la commande ci-dessus et remplacez log avec n'importe quel modèle que vous voulez associer.

ce regex peut être utilisé avec d'autres programmes où la correspondance inverse n'est pas supportée, comme -v option de grep

1
répondu traditional 2012-12-30 13:35:25