Jak grepować całe słowo

87

Używam następującego polecenia, aby grepować rzeczy w podkatalogach

find . | xargs grep -s 's:text'

Jednak to również znajduje takie rzeczy <s:textfield name="sdfsf"...../>

Co mogę zrobić, aby tego uniknąć, aby po prostu znajdował takie rzeczy <s:text name="sdfsdf"/>

LUB w tej sprawie ... również znajduje <s:text somethingElse="lkjkj" name="lkkj"

w zasadzie s:texti namepowinien znajdować się w tej samej linii ....

Josh
źródło
29
Czy ktoś przeczytał tytuł jako „jak grepować dla całego świata ”?
Earlz
15
@Earlz, nie, głównie dlatego, że wpisałem w Google „całe słowo grep”.
Łukasz

Odpowiedzi:

104

Chcesz mieć -wopcję określającą, że jest to koniec słowa.

find . | xargs grep -sw 's:text'

Derek H
źródło
70

Użyj, \baby dopasować „granice słów”, co sprawi, że wyszukiwanie będzie dotyczyć tylko całych słów.

Więc twój grep wyglądałby jakoś

grep -r "\bSTRING\b"

dodanie koloru i numerów linii również może pomóc

grep --color -rn "\bSTRING\b"

Z http://www.regular-expressions.info/wordboundaries.html :

Istnieją trzy różne pozycje, które kwalifikują się jako granice słów:

  • Przed pierwszym znakiem w ciągu, jeśli pierwszy znak jest znakiem słowa.
  • Po ostatnim znaku w ciągu, jeśli ostatni znak jest znakiem słowa.
  • Między dwoma znakami w ciągu, gdzie jeden jest znakiem słowa, a drugi nie jest znakiem słowa.
cs01
źródło
28

Możesz porzucić xargspolecenie, wykonując wyszukiwanie grep rekurencyjnie. Zwykle nie potrzebujesz flagi „s”. W związku z tym:

grep -wr 's:text' 
joctee
źródło
1

możesz spróbować rg, https://github.com/BurntSushi/ripgrep :

rg -w 's:text' . 

powinien to zrobić

ms4720
źródło
Chociaż ten link może odpowiedzieć na pytanie, lepiej jest zawrzeć tutaj zasadnicze części odpowiedzi i podać link do odniesienia. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie. - Z recenzji
Jibin Balachandran
4
Podałem odpowiedź: rg -w 's: text'.
ms4720
1
Mogą istnieć inne powody, aby zasugerować niestandardowe narzędzie, ale jako odpowiedź na pytanie, jak rozwiązać ten problem za pomocą standardu, grepnie jest to szczególnie atrakcyjne ani satysfakcjonujące, zwłaszcza biorąc pod uwagę, że grepma tę samą opcję.
tripleee
To zależy od tego, jak głębokie i tłuste są
kierunki
Zależy to od liczby plików, ripgrep może być znacznie szybszy, a find-> xargs tworzy nowy proces dla każdego pliku.
ms4720
0

Jeśli chcesz tylko odfiltrować pozostałą część tekstu, możesz to zrobić.

xargs grep -s 's:text '

Powinno to znaleźć tylko s:textwystąpienia ze spacją po ostatnim t. Jeśli chcesz znaleźć s:textinstancje, które mają tylko element name, prześlij wyniki do innego grepwyrażenia lub użyj wyrażenia regularnego, aby odfiltrować tylko potrzebne elementy.

Stefan Kendall
źródło
co się stanie, jeśli „tekst” znajduje się na końcu wyniku? Czy nie zostanie on pominięty w Twoim rozwiązaniu?
pkuszewski