In grep auf Ubuntu, wie kann ich nur den string, der auf den regulären Ausdruck?
Ich bin grundsätzlich grepping mit einem regulären Ausdruck auf. In der Ausgabe würde ich gerne sehen, nur die strings passen meine reg-exp.
In eine Reihe von XML-Dateien (meistens sind Sie single-line-Dateien, die mit riesigen Mengen an Daten, die in einer Linie), würde ich mag, um alle die Worte, die beginnen mit MAIL_.
Außerdem möchte ich den grep-Befehl auf der shell zu geben, nur die Wörter, die aufeinander abgestimmt sind und nicht die gesamte Zeile (die die gesamte Datei in diesem Fall).
Wie mache ich das?
Habe ich versucht
grep -Gril MAIL_* .
grep -Grio MAIL_* .
grep -Gro MAIL_* .
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst mit GNU grep ist installiert, mit Ubuntu-G-flag (verwenden Sie basic-regexp) ist der Standard, so können Sie es weglassen, aber, noch besser, nutzen Sie die erweiterte regexp-mit -E.
-r-flag bedeutet, dass rekursive Suche innerhalb von Dateien eines Verzeichnisses, das ist, was Sie brauchen.
Und, Sie haben Recht, zu benutzen,- o flag print übereinstimmenden Teil der Zeile. Auch, weglassen Dateinamen benötigen Sie ein h-Kennzeichen.
Den einzigen Fehler den Sie gemacht ist, den regulären Ausdruck selbst. Sie verpasste Charakter-Spezifikation vor *. Dein Befehl sollte so Aussehen:
Beispiel-Ausgabe (nicht rekursiv):
Versuchen Sie den folgenden Befehl
gibt nur den passenden text anstelle von kompletten Linien, aber das problem könnte dein regex ist nicht restriktiv oder gierig genug und eigentlich passt die gesamte Datei.
Aus deinem Kommentar zu Thor Antwort, es scheint, Sie wollen auch unterschieden werden, ob der
MAIL_.*
text ist ein text-Knoten oder Attribut ist, nicht nur zu isolieren, wenn es im XML-Dokument angezeigt. Grep XML kann nicht analysiert werden, Sie brauchen einen richtigen XML-parser für das.Einer Befehlszeile xml-parser ist xmlstarlet. Es ist verpackt in Ubuntu.
Es an diesem Beispiel wird die Datei Beispiel-Datei:
Für die Auswahl von text Knoten, die Sie verwenden können:
Und für die Auswahl von Attributen:
Erläuterungen:
//*
ist ein XPath-Ausdruck, der wählt alle Elemente im Dokument undtext()
Ausgänge den Wert Ihrer Kinder, text-Knoten, daher alles außer text-Knoten wird herausgefiltert//*[@*]
ist ein XPath-Ausdruck selektiert alle Attribute in das Dokument und dann@*
Ausgänge Ihren Wert