Ich kenne mich mit Regex, Sed usw. nicht so gut aus und bin ein bisschen zu faul, das gleich herauszufinden. Wie extrahiere ich also diese Zeile:
<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>
Lassen Sie mich wissen, ob mehr von der XML-Struktur benötigt wird.
Antwort1
Da die Eingabedaten (Ihre XML-Datei) strukturiert sind, ist es besser, eine Abfrage für diese strukturierten Daten durchzuführen, statt sie als einfachen Text zu behandeln und mit regulären Ausdrücken herumzuspielen.
Wir können xmllint --xpath
einen XPath-Ausdruck für Ihre XML-Eingabe auswerten:
$ xmllint --xpath 'string(rss/channel/*[local-name()="astronomy"]/@sunrise)' weather.xml
6:48 am
– das ist etwas umständlich, da wir in dieser Datei mit den unterschiedlichen Namespaces umgehen müssen, aber es funktioniert trotzdem.
Weitere Informationen zu XPath finden Sie in der Spezifikation unterhttp://www.w3.org/TR/xpath/
Antwort2
Sie verwenden weder Regex noch Sed. Sie verwenden einen XML-Parser und eine XML-Abfragesprache (XPath oder XQuery). Und ich fürchte, die Details hängen vom Kontext ab: Beispielsweise ist „yweather“ ein Kurzname (Präfix) für einen Namespace, und Sie müssen wissen, welchen Namespace er darstellt.
Antwort3
Die richtige Antwort ist, wie Michael Kay sagt, die Verwendung eines XML-spezifischen Tools.
Hier ist eine schnelle und einfache Lösung mit einem Sed-Ansatz. Beginnen wir mit dieser Datei:
$ cat file
<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>
So extrahieren Sie die Sonnenuntergangszeit:
$ sed -rn 's/.*sunset="([^"]*)".*/\1/p' file
7:06 pm
Um den regulären Ausdruck zu verstehen, teilen wir ihn in drei Teile auf:
.*
Übereinstimmungen vom Anfang der Zeile bis zum zweiten TeilDieser Teil,
sunset="([^"]*)"
, entspricht den Zeichensunset="
, gefolgt von einer beliebigen Anzahl von Zeichen außer"
, gefolgt vom schließenden"
. Der Ausdruck[^"]
bedeutet jedes Zeichen außer"
und[^"]*
bedeutet eine beliebige Anzahl solcher Zeichen. Die Klammern,(...)
, erfassen die Zeichen innerhalb von"..."
in seds Gruppe 1, die wir später als referenzieren\1
..*
passt zu allen Zeichen nach dem Sonnenuntergangsausdruck.
Antwort4
Ich werde die gleiche Antwort geben wieJeremy Kerraber ich gebe ihm ein xml
Beispiel.
Wir haben eine XML-Datei config.xml
in unserem Stammordner und möchten ein Attribut oder eine Eigenschaft eines Tags lesen, sei es das widget
Tag.
config.xml
:
<?xml version='1.0' encoding='utf-8'?>
<widget android-versionCode="16" id="co.app.world" ios-CFBundleVersion="0.1.3" version="3.0.5" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>AppName</name>
<description>Description.</description>
<author email="hi@ionicframework" href="http://ionicframework.com/">Ionic Framework Team</author>
</widget>
Wir möchten den android-versionCode
Eigenschaftswert erhalten, wir geben Folgendes in das Terminal ein:
xmllint --xpath "string(//*[local-name()='widget']/@android-versionCode)" config.xml
Ausgabe:
16
Erklärung: Wir verwenden es, /*[local-name()='widget']
um das Tag zuzuordnen widget
und dann @android-versionCode
die Eigenschaft davon zu lesen.