Gibt es eine Möglichkeit, grep-Ausgabe von "Wörtern" aus Dateien zu erstellen, die dem Suchausdruck entsprechen?
Wenn ich alle Instanzen von "th" in einer Reihe von Dateien finden möchte, kann ich Folgendes tun:
grep "th" *
aber die Ausgabe wird so etwas wie sein (fett ist von mir);
Eine Textdatei: Die Katze saß auf der Matte eine andere Textdatei: der schnelle braune Fuchs Noch eine Textdatei: Ich hoffe, das erklärt es gründlich
Ich möchte, dass es mit derselben Suche ausgegeben wird:
the
the
the
this
thoroughly
Ist das mit grep möglich? Oder mit einer anderen Kombination von Werkzeugen?
Antworten:
Versuchen Sie es mit grep -o
Bearbeiten: Übereinstimmung mit Phils Kommentar
Aus den Dokumenten :
quelle
"\w*th\w*" *
bedeutet, also dachte ich, ich würde posten.\w
ist [_ [: alnum:]], daher entspricht dies grundsätzlich jedem "Wort", das 'th' enthält (da\w
kein Leerzeichen enthalten ist). Das * nach dem zitierten Abschnitt ist ein Glob, für den Dateien (dh alle Dateien in diesem Verzeichnis übereinstimmen)\w
ist im Allgemeinen nicht tragbar fürgrep -E
; Verwenden Sie für eine ordnungsgemäße Portabilität[[:alnum:]]
stattdessen den Namen der POSIX-Zeichenklasse (oder[_[:alnum:]]
wenn Sie den Unterstrich auch wirklich möchten; oder versuchen Sie,grep -P
ob Ihre Plattform diesen hat).-h
notwendig, würde ich sagen ..?Cross Distribution sichere Antwort (einschließlich Windows minGW?)
Wenn Sie ältere Versionen von grep (wie 2.4.2) verwenden, die die Option -o nicht enthalten. Verwenden Sie die oben genannten. Andernfalls verwenden Sie die einfachere, um die unten stehende Version zu pflegen.
Linux Cross Distribution sichere Antwort
Um Zusammenfassungen
-oh
auszugeben, stimmt der reguläre Ausdruck mit dem Dateiinhalt (und nicht mit dem Dateinamen) überein, genau wie Sie erwarten würden, dass regulärer Ausdruck in vim / etc funktioniert ... Welches Wort oder welcher reguläre Ausdruck Sie dann suchen würden, hängt davon ab Du! Solange Sie bei POSIX und nicht bei der Perl-Syntax bleiben (siehe unten)Mehr aus dem Handbuch für grep
Der Grund, warum die ursprüngliche Antwort nicht für alle funktioniert
Die Verwendung von
\w
variiert von Plattform zu Plattform, da es sich um eine erweiterte "Perl" -Syntax handelt. Daher verwendet die Grep-Installation, die auf die Arbeit mit POSIX-Zeichenklassen beschränkt ist,[[:alpha:]]
nicht das Perl-Äquivalent von\w
. Weitere Informationen finden Sie auf der Wikipedia-Seite zum regulären AusdruckLetztendlich wird die obige POSIX-Antwort unabhängig von der Plattform (die das Original ist) für grep viel zuverlässiger sein
Für die Unterstützung von grep ohne die Option -o gibt der erste grep die relevanten Zeilen aus, der tr teilt die Leerzeichen in neue Zeilen auf, der letzte grep filtert nur für die jeweiligen Zeilen.
(PS: Ich weiß, dass die meisten Plattformen inzwischen für \ w gepatcht worden wären ... aber es gibt immer solche, die zurückbleiben)
Gutschrift für die "-o" -Umgehung aus der Antwort von @AdamRosenfield
quelle
-o
Option ist in Windows Grep, das mit dem Git-Paket (minGW?) installiert wird, nicht vorhanden:"c:\Program Files (x86)\Git\bin\grep" --version grep (GNU grep) 2.4.2
Es ist einfacher als Sie denken. Versuche dies:
Wo,
quelle
Sie können Leerzeichen in Zeilenumbrüche übersetzen und dann grep, z.
quelle
tr
, könnte ergrep
zuerst tun ,tr
würde also nur auf übereinstimmende Linien angewendet werden:grep th filename | tr ' ' '\n' | grep th
Nur
awk
keine Kombination von Werkzeugen erforderlich.quelle
grep Befehl nur für Matching und Perl
quelle
th
weil Sie die kürzestmögliche Wiederholung des Platzhalters angefordert haben.Ich war unzufrieden mit der schwer zu merkenden Syntax von awk, aber ich mochte die Idee, ein einziges Dienstprogramm zu verwenden, um dies zu tun.
Es scheint, als ob ack (oder ack-grep, wenn Sie Ubuntu verwenden) dies leicht tun kann:
Wenn Sie das Flag -h weglassen, erhalten Sie:
Als Bonus können Sie das
--output
Flag verwenden, um dies für komplexere Suchvorgänge mit der einfachsten Syntax zu tun, die ich gefunden habe:quelle
quelle
cat
?Um alle Wörter mit dem Start mit "icon-" zu suchen, funktioniert der folgende Befehl perfekt. Ich verwende hier Ack , das ähnlich wie grep ist, aber bessere Optionen und eine gute Formatierung aufweist.
quelle
Sie können auch pcregrep ausprobieren . Es gibt auch eine
-w
Option in grep , aber in einigen Fällen funktioniert sie nicht wie erwartet.Aus Wikipedia :
quelle
Ich hatte ein ähnliches Problem, als ich nach Grep / Pattern Regex und dem "Matched Pattern Found" als Ausgabe suchte.
Am Ende habe ich egrep (der gleiche reguläre Ausdruck auf grep -e oder -G hat mir nicht das gleiche Ergebnis von egrep gegeben) mit der Option -o verwendet
Ich denke, das könnte etwas Ähnliches sein (ich bin KEIN Regex-Meister):
quelle
{1}
Quantifizierer sollten fallengelassen werden. Oder wenn Sie konsequent sein wollen,t{1}h{1}e{1}
etc.Sie können Ihre grep-Ausgabe folgendermaßen in Perl leiten:
quelle
Auszug aus der Grep-Manpage:
-w: Wählen Sie nur die Zeilen aus, die Übereinstimmungen enthalten, die ganze Wörter bilden. Der Test besteht darin, dass der übereinstimmende Teilstring entweder am Anfang der Zeile stehen muss oder ein Nicht-Wort-Bestandteil vorangestellt sein muss.
quelle
the
nicht mehr Übereinstimmungen zB "diese" oder "baden" übereinstimmen.ripgrep
Hier ist das Beispiel mit
ripgrep
:Es werden alle Wörter übereinstimmen, die übereinstimmen
th
.quelle