Ich habe eine Datei, die ungefähr so aussieht:
<table name="content_analyzer" primary-key="id">
<type="global" />
</table>
<table name="content_analyzer2" primary-key="id">
<type="global" />
</table>
<table name="content_analyzer_items" primary-key="id">
<type="global" />
</table>
Ich muss alles in den folgenden Anführungszeichen extrahieren name=
, dh content_analyzer
, content_analyzer2
und content_analyzer_items
.
Ich mache das auf einer Linux-Box, also ist eine Lösung mit sed, perl, grep oder bash in Ordnung.
regex
perl
sed
html-parsing
text-extraction
Wrangler
quelle
quelle
Antworten:
Da Sie Inhalte
name="
abgleichen müssen, ohne sie in das Ergebnis aufzunehmen (müssen übereinstimmen, aber nicht Teil des gewünschten Ergebnisses sein), ist eine Form der Übereinstimmung mit der Breite Null oder der Gruppenerfassung erforderlich. Dies kann einfach mit den folgenden Tools durchgeführt werden:Perl
Mit Perl können Sie die
n
Option verwenden, um Zeile für Zeile eine Schleife zu erstellen und den Inhalt einer Erfassungsgruppe zu drucken, wenn er übereinstimmt:GNU grep
Wenn Sie eine verbesserte Version von grep haben, z. B. GNU grep, steht Ihnen möglicherweise die
-P
Option zur Verfügung. Diese Option aktiviert Perl-ähnliche Regex, sodass Sie\K
eine Kurzform verwenden können. Die Übereinstimmungsposition wird zurückgesetzt, also alles, was vorher Null ist.Mit dieser
o
Option druckt grep nur den übereinstimmenden Text anstelle der gesamten Zeile.Vim - Texteditor
Eine andere Möglichkeit besteht darin, einen Texteditor direkt zu verwenden. Mit Vim besteht eine der verschiedenen Möglichkeiten, dies zu erreichen, darin, Zeilen ohne zu löschen
name=
und dann den Inhalt aus den resultierenden Zeilen zu extrahieren:Standard grep
Wenn Sie aus irgendeinem Grund keinen Zugriff auf diese Tools haben, kann mit Standard-Grep etwas Ähnliches erreicht werden. Ohne das Umschauen muss es jedoch später bereinigt werden:
Ein Hinweis zum Speichern von Ergebnissen
In allen obigen Befehlen werden die Ergebnisse an gesendet
stdout
. Es ist wichtig zu beachten, dass Sie sie jederzeit speichern können, indem Sie sie durch Anhängen an eine Datei weiterleiten:bis zum Ende des Befehls.
quelle
grep
):grep -Po '.*name="\K.*?(?=".*)'
.*
beiseite gelassen . Ich hoffe, Sie werden mir nicht böse. Ich würde gerne fragen, sehen Sie irgendwelche Vorteile von einem gierigen Match gegenüber "irgendetwas außer"
"? Nimm das nicht als Kampf, ich bin nur neugierig und kein Regex-Experte. Auch der\K
Tipp, wirklich schön. Danke Dennis..*
kannst du tungrep -Po '(?<=name=").*?(?=")'
. Das\K
kann für Kurzschrift verwendet werden, wird aber wirklich nur benötigt, wenn die Übereinstimmung links davon eine variable Länge hat. In solchen Fällen liegt der Grund für die Verwendung von Lookarounds auf der Hand. Ungreedy Operationen schauen ein wenig übersichtliche ( im[^"]*
Vergleich zu.*?
und Sie nicht über die Ankerzeichen wiederholen müssen ich nicht wissen , über Geschwindigkeit , die viel hängt vom Kontext ab, ich denke , ich hoffe , das ist hilfreich....\K
(nachdem ich es recherchiert habe) und es entfernt habe,.*
war der gleiche: Lass es hübsch aussehen (einfacher). Und ich habe nie daran gedacht,.*?
anstelle der "traditionellen Art", die ich irgendwo gelernt habe, zu verwenden. Aber hier macht es wirklich Sinn, nicht gierig zu sein. Danke Dennis, beste Wünsche.Der reguläre Ausdruck wäre:
Dann wäre die Gruppierung in der \ 1
quelle
Wenn Sie Perl verwenden, laden Sie ein Modul herunter, um XML zu analysieren: XML :: Simple , XML :: Twig oder XML :: LibXML . Erfinde das Rad nicht neu.
quelle
<type="global"
zum Beispiel) nicht gut geformt ist , sodass sich die meisten XML-Parser nur beschweren und sterben.Zu diesem Zweck sollte ein HTML-Parser anstelle von regulären Ausdrücken verwendet werden. Ein Perl-Programm, das Folgendes verwendet
HTML::TreeBuilder
:Programm
Ausgabe
quelle
das könnte es tun:
quelle
Hier ist eine Lösung mit HTML tidy & xmlstarlet:
quelle
Hoppla, der Befehl sed muss natürlich dem Befehl ordentlich vorausgehen:
quelle
Wenn die Struktur Ihrer XML-Datei (oder des Textes im Allgemeinen) festgelegt ist, ist die Verwendung am einfachsten
cut
. Für Ihren speziellen Fall:quelle