Ich möchte eine pom.xml ('Project Object Model' von Maven) lesen und die Versionsinformationen extrahieren. Hier ist ein Beispiel:
<?xml version="1.0" encoding="UTF-8"?><project
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>project-parent</artifactId>
<name>project-parent</name>
<version>1.0.74-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.sybase.jconnect</groupId>
<artifactId>jconnect</artifactId>
<version>6.05-26023</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
</project>
Wie kann ich die Version '1.0.74-SNAPSHOT' von oben extrahieren?
Würde gerne in der Lage sein, dies mit einfachen Bash-Skripten sed oder awk zu tun. Ansonsten wird eine einfache Python bevorzugt.
BEARBEITEN
Zwang
Die Linux-Box befindet sich in einer Unternehmensumgebung, sodass ich nur bereits installierte Tools verwenden kann (nicht, dass ich kein Hilfsprogramm wie xml2 anfordern kann, aber viel Bürokratie aufwenden muss). Einige der Lösungen sind sehr gut (lernen Sie bereits ein paar neue Tricks), können jedoch aufgrund der eingeschränkten Umgebung nicht angewendet werden
aktualisierte XML-Liste
Ich habe das Dependencies-Tag zum ursprünglichen Listing hinzugefügt. Dies zeigt, dass in diesem Fall eine hackige Lösung möglicherweise nicht funktioniert
Distro
Die Distribution, die ich benutze, ist RHEL4
Antworten:
xml2 kann xml in ein zeilenorientiertes Format konvertieren:
quelle
Anderer Weg: xmlgrep und XPath:
Nachteil: langsam
quelle
xml_grep
Verwenden
python
Verwenden
xmlstarlet
Verwenden
xmllint
quelle
cat (//x:version)[1]/text()
bei der verwendung klappt dasxmllint
auch!Clojure Weg. Benötigt nur JVM mit spezieller JAR-Datei:
Scala Weg:
Grooviger Weg:
quelle
Hier ist eine Alternative in Perl
Es funktioniert mit dem überarbeiteten / erweiterten Beispiel in den Fragen, das mehrere "Versions" -Elemente in unterschiedlichen Tiefen enthält.
quelle
Hacky Way:
Setzt korrekte Einrückung voraus
<version>
quelle
<version>
Dinge gelesen habe .Erarbeiten Sie eine sehr ungeschickte Ein-Liner-Lösung
Das Sed am Ende ist sehr hässlich, aber ich konnte den Text des Knotens nicht mit mindom alleine ausdrucken.
Update von _Vi :
Weniger hackige Python-Version:
Update von mir
Andere Version:
quelle
XSLT-Weg:
quelle
Wenn "Es gibt viele Versions-Tags in der XML", vergessen Sie besser, dies mit "einfachen Werkzeugen" und regulären Ausdrücken zu tun, das reicht nicht.
Probieren Sie diese Python (keine Abhängigkeiten):
quelle
Hier ist ein Einzeiler mit sed:
quelle
<version>
s können nur innerhalb von Abhängigkeiten sein.Hier, versuchen Sie dies:
quelle
Ich weiß, dass Ihre Frage Linux lautet, aber wenn Sie dies unter Windows tun müssen, ohne Tools von Drittanbietern zu benötigen, damit Sie es in eine Batch-Datei einfügen können, kann Powershell jeden Knoten wie folgt aus der Datei pom.xml extrahieren :
quelle
Mit dieser
-n
Option wird vermieden, dass nicht übereinstimmende Zeilen gedruckt werden. first match (/.../
) steht in der Zeile vor der Zeile mit dem gesuchten Text. Dern
Befehl springt zur nächsten Zeile, in ders
relevante Informationen durch eine Erfassungsgruppe (\(...\)
) und eine Rückverweisung (\1
) extrahiert werden .p
druckt aus,q
beendet.quelle
awk funktioniert ohne zusätzliche Werkzeuge.
cat pod.xml
einfache und lesbare Möglichkeit, den Wert des
<packaging>
Tags zu ermitteln:quelle