grep dla ciągu nie poprzedzonego innym ciągiem

10

Czy za pomocą grep można wyszukiwać wystąpienia, John Smithale je wykluczać Mr John Smith?

Sam Hastings
źródło

Odpowiedzi:

9

Można to rozwiązać za pomocą wyrażenia regularnego z negatywnym wyglądem (który jest eksperymentalnie obsługiwany, grepjak wskazano w komentarzu z arrange):

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

Ponieważ obsługa jest tylko eksperymentalna, możesz perlzamiast tego użyć :

$ perl -nle 'print if /(?<!Mr )John Smith/' file
jcollado
źródło
Jest obsługiwany eksperymentalnie w grep : echo $string | grep -P '(?<!Mr )John Smith'.
umówić
@ararate Rzeczywiście. Dzięki, zaktualizuję odpowiedź.
jcollado,
6

Możesz wykonać

command | grep 'John Smith' | grep -v 'Mr John Smith'
enzotib
źródło
1
Fajny pomysł, ale nie zadziała, jeśli linia maJohn Smith Mr John Smith John Smith
Ron
1

Aby użyć wyrażeń regularnych, użyj ^ i $

grep "^John Smith$"

^ jest zgodne od początku $ jest zgodne od końca.

Składnia będzie się różnić w zależności od tego, czego szukasz w jakim pliku.

Możesz używać wyrażeń regularnych z sed, grep, awk ....

Przykład

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

bodhi@Ubuntu:~ grep "^John Smith$" file
John Smith
Pantera
źródło
OP nie prosi, aby ciąg znaków był jedyną rzeczą w jego linii.
enzotib,