grep pour chaîne non précédée d'une autre chaîne

10

Est-il possible, en utilisant grep, de rechercher des instances de John Smithmais d'exclure des instances de Mr John Smith?

Sam Hastings
la source

Réponses:

9

Cela pourrait être résolu en utilisant une expression régulière avec un lookbehind négatif (qui est supporté expérimentalement grepcomme le souligne le commentaire d'arranger):

$ grep -P '(?<!Mr )John Smith' file

Puisque le support est juste expérimental, vous voudrez peut-être utiliser à la perlplace:

$ perl -nle 'print if /(?<!Mr )John Smith/' file
jcollado
la source
Il est soutenu expérimentalement grep : echo $string | grep -P '(?<!Mr )John Smith'.
organiser
@arrange Effectivement. Merci, je mettrai à jour la réponse.
jcollado
6

Vous pouvez exécuter

command | grep 'John Smith' | grep -v 'Mr John Smith'
enzotib
la source
1
Belle idée, mais ne fonctionnera pas si la ligne aJohn Smith Mr John Smith John Smith
Ron
1

Pour utiliser des expressions régulières, utilisez ^ et $

grep "^John Smith$"

^ correspond au début $ correspond à la fin.

La syntaxe variera en fonction de ce que vous recherchez dans quel fichier.

Vous pouvez utiliser des expressions régulières avec sed, grep, awk ....

Exemple

bodhi@Ubuntu:~ cat file
Mr John Smith
John Smith
John
Smith

bodhi@Ubuntu:~ grep "^John Smith$" file
John Smith
Panthère
la source
L'OP ne demande pas que la chaîne soit la seule chose sur sa ligne.
enzotib