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


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'


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.

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' 

1

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

rg -w 's:text' . 

Sollte es tun


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.


Was ist, wenn der "Text" am Ende der Ausgabe steht? Wird es in Ihrer Lösung nicht übersprungen?
pkuszewski
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.