Mögliches Duplizieren:
Suchen Sie unter Linux nach einem Textmuster
In Bash habe ich mich gefragt, ob es Befehle gibt, mit denen Sie wissen können, ob eine bestimmte Zeichenfolge, nach der Sie suchen, in den Dateien im aktuellen Verzeichnis vorhanden ist, in dem Sie sich befinden.
Angenommen, Sie suchen in einem Satz von C-Dateien in Ihrem aktuellen Verzeichnis nach der Funktion 'toUpperCase ()'. Es gibt viele Dateien, daher möchten Sie nicht jede manuell mit vim öffnen und nach der Zeichenfolge 'toUpperCase' suchen, da dies viel Zeit in Anspruch nehmen würde. Wenn dies keine Bash-Befehlszeile ist, gibt es eine andere Methode, um dies effizient durchzuführen?
Das Standardwerkzeug für die Textsuche ist grep .
So suchen Sie
toUpperCase(
in allen.c
Dateien im aktuellen Verzeichnis nach der Zeichenfolge :Wenn Sie auch in Unterverzeichnissen suchen möchten:
Wenn Sie nach C-Funktionsaufrufen suchen, sind ctags möglicherweise besser geeignet. Sie führen es einmal für alle Ihre Quelldateien aus, um einen Index der Bezeichner zu erstellen, und verwenden dann Ihren Editor, um zwischen den Aufrufen zu navigieren. Alle vi-ähnlichen Editoren können die
TAGS
Datei von ctags verwenden. Wenn Sie Emacs verwenden, führen Sie das ähnliche Programm ausetags
.quelle
ctags
ist für die Suche nach Funktion nützliche Definitionen , nicht Funktion Anrufe .Du benutzt Vim. Sie haben ein eingebautes Tool, um dies zu tun.
Vorhersehbar gibt es sieben Antworten, die bereits zur Verwendung sagen
grep
. Aber ich scheine die einzige Person zu sein, die von Ihrer Frage bemerkt hat, dass Sie verwendenvim
. Als solches, wenn auch Sie können Verwendunggrep
von innenvim
, können Sie auch verwenden ,vim
s‘integrierte Tool. Dies wird über den:vimgrep
Befehl aufgerufen .Um "alle C-Quelldateien im aktuellen Verzeichnis nach Aufrufen der Funktion zu durchsuchen", geben Sie
toUpperCase()
denvim
Befehl einDie resultierende Liste der Übereinstimmungen wird automatisch in die Quickfix-Liste geladen, auf die mit einer der folgenden Optionen zugegriffen werden kann (in der Online-Hilfe finden Sie den subtilen Unterschied).
Um die Funktion zu finden Definition , anstatt Anrufe es,
ctags
ist das Werkzeug, wie in der genanntenGilles
‚s Antwort , in Verbindung mit der:tjump
oder:tselect
Befehlen.Warum benutzen
:vimgrep
?Die Online-Hilfe (
:help grep
) zählt einige der Gründe auf, auf die ich hier nicht näher eingehen möchte. Vergleichen Sie außerdem die Aktion von:vimgrep
mit derdietbuddha
Antwort von .dietbuddha
Die Befehlszeile von gibt einen individuellengrep
Prozess für jede einzelne C-Quelldatei aus. Es wird nicht einmal eingesetzt,xargs
um diesen Aufwand zu reduzieren. Und Sie müssen die Ausgabe noch irgendwie analysieren, um Ihren Texteditor für die relevanten Quelldateien aufzurufen, sobald er fertig ist.:vimgrep
Fork nicht mehrere zusätzliche Prozesse überhaupt, und mit dem Ergebnis ist die Einfachheit selbst. Das bloße Auswählen eines der Einträge in der resultierenden Quickfix-Liste positioniert den Cursor automatisch in der entsprechenden Zeile der entsprechenden Quelldatei.In der Tat macht es genau das, was Sie geschrieben haben, was Sie von Hand tun würden, außer automatisch. Es ist die automatisierte Methode, um genau diese Texteditor-Aktionen auszuführen. Es lädt die Datei wie von Hand, sucht nach einem regulären Ausdruck (unter Verwendung derselben Syntax für reguläre Ausdrücke, die Sie bereits an anderer Stelle verwenden
vim
), zeichnet die Stellen auf, an denen Übereinstimmungen auftreten, und entlädt die Datei.quelle
Ja, das Tool wird aufgerufen
grep
.Grundsätzliche Verwendung ist:
Oder genauer:
In einem sehr einfachen Fall möchten Sie rekursiv alle Dateien durchsuchen und geben daher die
-r
Option an. Wenn Sie sich nicht für Groß- oder Kleinbuchstaben interessieren, können Sie die-i
Option verwenden , um die Groß- und Kleinschreibung zu ignorieren.Wenn Sie nur die passenden Teile wünschen, verwenden Sie die
-o
Option.Grep kann reguläre Ausdrücke verwenden und verfügt über ein umfangreiches Handbuch .
quelle
grep
ist die Standardantwort. Verwenden Sie entweder die Option -r, um rekursiv oder in Verbindung mit zu suchenfind
(Diskussion und Beispiele in anderen Fragen auf dieser Site, z. B. dieser ).Meine bevorzugte Wahl in letzter Zeit ist
ack
. Es ist wahrscheinlich nicht auf Ihrem Computer installiert, aber Sie können es mit apt-get auf Ubuntu installieren oder einfach herunterladen. Links, Anleitungen und Gründe, die besser sind als grep, finden Sie unter http://betterthangrep.com/quelle
find
undgrep
find myproject -name '*.c' -exec grep 'toUpperCase(' {} \; -print
warum nicht nur
grep
?grep -r string .
Durchläuft alle Dateien im aktuellen Verzeichnis. Wenn Sie Objektdateien oder andere Binärdateien haben, erhalten Sie möglicherweise eine Übereinstimmung mit binären Ergebnissen, auch bekannt als. Müll. Wenn sich in Ihrem Unterverzeichnis auch Fifos oder Gerätedateien befinden, kann dies unbekannte / unbeabsichtigte Folgen haben.grep string *.c
durchsucht nur die aktuellen Verzeichnisdateien.c
.grep string **/*.c
durchsucht alle Unterverzeichnisse. Wenn Sie jedoch über eine sehr große Anzahl von.c
Dateien verfügen, besteht die Gefahr, dass die maximale Anzahl von Erweiterungen für den Shell-Glob überschritten wird. Die Erweiterung muss auch zuerst geschehen, was bedeutet, dass vor demgrep
Beginn ein vollständiger Baumdurchlauf durchgeführt wird .quelle
Grep macht den Trick, aber ein bisschen zusätzliches Scripting hilft dabei, den Namen der Datei und die genaue Zeile zu finden, auf die verwiesen wird. Wenn es das ist, was Sie wollen, finde ich, dass das folgende gut funktioniert. Ich habe es als Shell-Skript gespeichert und den gewünschten Wert als erste Befehlszeilenoption übergeben.
quelle
Ich finde es interessant, dass niemand Ihre spezifische Frage beantwortet hat: "Wie finde ich, ob eine bestimmte Zeichenfolge in den Dateien im aktuellen Verzeichnis vorhanden ist". Soweit ich weiß, gibt es keine grep-Option, die nur zurückgibt, ob eine Übereinstimmung in einer Gruppe von Dateien gefunden wurde. Die nächstgelegene Option ist -l, um die Dateinamen aufzulisten. Die naheliegendste Antwort stammt von Tim, mit einigen kleinen Verbesserungen:
Sie können dieses Shell-Skript allgemeiner gestalten, indem Sie ein zweites Argument für die Dateierweiterung akzeptieren, ohne zu viel Mühe zu haben.
doug
quelle