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?
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"
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
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