Wie man nach dem ganzen Wort greift

82

Ich benutze den folgenden Befehl, um Sachen in Unterverzeichnissen zu grep

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

Dies findet aber auch Sachen wie <s:textfield name="sdfsf"...../>

Was kann ich tun, um das zu vermeiden, damit es nur Dinge wie findet? <s:text name="sdfsdf"/>

ODER für diese Angelegenheit .... findet auch <s:text somethingElse="lkjkj" name="lkkj"

im Grunde s:textund namesollte in der gleichen Zeile sein ....

Josh
quelle
29
Hat jemand den Titel als "wie man für die ganze Welt grep" gelesen ?
Earlz
14
@Earlz, nein, hauptsächlich, weil ich "grep ganzes Wort" gegoogelt habe.
Luke

Antworten:

99

Sie möchten, dass die -wOption angibt, dass es das Ende eines Wortes ist.

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

Derek H.
quelle
66

Verwenden Sie \bdiese Option, um "Wortgrenzen" abzugleichen, sodass Ihre Suche nur mit ganzen Wörtern übereinstimmt.

Ihr grep würde also ungefähr so ​​aussehen

grep -r "\bSTRING\b"

Das Hinzufügen von Farb- und Zeilennummern kann ebenfalls hilfreich sein

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

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

Es gibt drei verschiedene Positionen, die als Wortgrenzen gelten:

  • Vor dem ersten Zeichen in der Zeichenfolge, wenn das erste Zeichen ein Wortzeichen ist.
  • Nach dem letzten Zeichen in der Zeichenfolge, wenn das letzte Zeichen ein Wortzeichen ist.
  • Zwischen zwei Zeichen in der Zeichenfolge, wobei eines ein Wortzeichen und das andere kein Wortzeichen ist.
cs01
quelle
28

Sie können den xargsBefehl löschen, indem Sie die Grep-Suche rekursiv durchführen. Und normalerweise brauchen Sie die Flagge 's' nicht. Daher:

grep -wr 's:text' 
Joctee
quelle
1

Sie könnten versuchen, rg, https://github.com/BurntSushi/ripgrep :

rg -w 's:text' . 

Sollte es tun

ms4720
quelle
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - Aus der Bewertung
Jibin Balachandran
3
Ich habe die Antwort gegeben: rg -w 's: text'.
ms4720
1
Es kann andere Gründe geben, ein nicht standardisiertes Tool vorzuschlagen, aber als Lösung für eine Frage, wie dies mit Standard gelöst werden kann, ist dies grepnicht besonders überzeugend oder befriedigend, insbesondere angesichts grepder gleichen Option.
Tripleee
Es hängt davon ab, wie tief und fett die directi
ms4720
Dies hängt von der Anzahl der Dateien ab. Ripgrep kann viel schneller sein und find-> xargs erstellt für jede Datei einen neuen Prozess.
ms4720
0

Wenn Sie nur den restlichen Textteil herausfiltern möchten, können Sie dies tun.

xargs grep -s 's:text '

Dies sollte nur s:textInstanzen mit einem Leerzeichen nach dem letzten t finden. Wenn Sie s:textInstanzen suchen müssen , die nur ein Namenselement enthalten, leiten Sie Ihre Ergebnisse entweder an einen anderen grepAusdruck weiter oder verwenden Sie Regex, um nur die benötigten Elemente zu filtern.

Stefan Kendall
quelle
Was ist, wenn der "Text" am Ende der Ausgabe steht? Wird es in Ihrer Lösung nicht übersprungen?
pkuszewski