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 ....


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'


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.

28

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

grep -wr 's:text' 

1

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

rg -w 's:text' . 

powinien to zrobić


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.


co się stanie, jeśli „tekst” znajduje się na końcu wyniku? Czy nie zostanie on pominięty w Twoim rozwiązaniu?
pkuszewski
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.