Chcę przeczytać plik pom.xml („Project Object Model” Maven) i wyodrębnić informacje o wersji. Oto przykład:
<?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>
Jak mogę wyodrębnić wersję „1.0.74-SNAPSHOT” z powyższego?
Chciałbym móc to zrobić za pomocą prostych skryptów bash sed lub awk. W przeciwnym razie preferowany jest prosty python.
EDYTOWAĆ
Przymus
Linux jest w środowisku korporacyjnym, więc mogę korzystać tylko z narzędzi, które są już zainstalowane (nie dlatego, że nie mogę zażądać narzędzi takich jak xml2, ale muszę przejść wiele biurokracji). Niektóre rozwiązania są bardzo dobre (poznaj już kilka nowych sztuczek), ale mogą nie mieć zastosowania ze względu na ograniczone środowisko
zaktualizowana lista xml
Dodałem tag zależności do pierwotnego wpisu. To pokaże, że niektóre zhackowane rozwiązania mogą nie działać w tym przypadku
Distro
Distro, którego używam, to RHEL4
Odpowiedzi:
xml2 może konwertować xml do / z formatu liniowego:
źródło
Inny sposób: xmlgrep i XPath:
Wada: powolna
źródło
xml_grep
Za pomocą
python
Za pomocą
xmlstarlet
Za pomocą
xmllint
źródło
cat (//x:version)[1]/text()
przy użyciuxmllint
działa również!Sposób Clojure. Wymaga tylko jvm ze specjalnym plikiem jar:
Sposób Scala:
Groovy way:
źródło
Oto alternatywa w Perlu
Działa ze zmienionym / rozszerzonym przykładem w pytaniach, które mają wiele elementów „wersji” na różnych głębokościach.
źródło
Hacky sposób:
Opiera się na prawidłowym wcięciu wymaganego
<version>
źródło
<version>
rzeczach.Opracuj bardzo niezdarne, jedno-liniowe rozwiązanie
Sed na końcu jest bardzo brzydki, ale nie byłem w stanie wydrukować tekstu węzła sam z Mindom.
Aktualizacja od _Vi :
Mniej zhackowana wersja Pythona:
Zaktualizuj ode mnie
Inna wersja:
źródło
Sposób XSLT:
źródło
jeśli „w pliku XML jest dużo znaczników wersji”, lepiej zapomnij o zrobieniu tego za pomocą „prostych narzędzi” i wyrażeń regularnych, to nie wystarczy.
wypróbuj ten python (bez zależności):
źródło
Oto jedna linijka za pomocą sed:
źródło
<version>
s mogą być tylko wewnątrz zależności.awk działa dobrze bez użycia dodatkowych narzędzi.
cat pod.xml
prosty i czytelny sposób na uzyskanie wartości
<packaging>
tagu:źródło
Tutaj spróbuj tego:
źródło
Wiem, że twoje pytanie mówi o Linuksie, ale jeśli musisz to zrobić w systemie Windows bez użycia narzędzi innych firm, takich, które można umieścić w pliku wsadowym, Powershell może wyodrębnić dowolny węzeł z pliku pom.xml w ten sposób :
źródło
Ta
-n
opcja pozwala uniknąć drukowania niepasujących linii; pierwsze dopasowanie (/.../
) jest w linii przed tą z poszukiwanym tekstem;n
rozkaz przechodzi do następnej linii, gdzies
ekstrakty istotnych informacji thru grupy przechwytujące (\(...\)
) i wsteczne (\1
).p
drukuje,q
wychodzi.źródło