Je veux lire un pom.xml ('Project Object Model' de Maven) et extraire les informations de version. Voici un exemple:
<?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>
Comment puis-je extraire la version '1.0.74-SNAPSHOT' d'en haut?
J'adorerais pouvoir le faire en utilisant un script bash simple sed ou awk. Sinon, un simple python est préféré.
ÉDITER
Contrainte
La boîte Linux est dans un environnement d'entreprise, donc je ne peux utiliser que des outils déjà installés (pas que je ne puisse pas demander d'utilitaire comme xml2, mais je dois passer par beaucoup de paperasserie). Certaines des solutions sont très bonnes (apprenez déjà quelques nouvelles astuces), mais elles peuvent ne pas être applicables en raison de l'environnement restreint
liste xml mise à jour
J'ai ajouté la balise de dépendances à la liste d'origine. Cela montrera qu'une solution hacky peut ne pas fonctionner dans ce cas
Distro
La distribution que j'utilise est RHEL4
Réponses:
xml2 peut convertir du xml vers / à partir d'un format orienté ligne:
la source
Autre moyen: xmlgrep et XPath:
Inconvénient: lent
la source
xml_grep
En utilisant
python
En utilisant
xmlstarlet
En utilisant
xmllint
la source
cat (//x:version)[1]/text()
lors de l'utilisationxmllint
fonctionne également!Façon clojure. Nécessite uniquement jvm avec un fichier jar spécial:
Manière Scala:
Façon groovy:
la source
Voici une alternative en Perl
Il fonctionne avec l'exemple révisé / étendu dans les questions qui a plusieurs éléments "version" à différentes profondeurs.
la source
Façon hacky :
Repose sur une indentation correcte des éléments requis
<version>
la source
<version>
choses.Élaborez une solution à un revêtement très maladroite
Le sed à la fin est très moche mais je n'ai pas pu imprimer le texte du nœud avec mindom seul.
Mise à jour depuis _Vi :
Version Python moins hacky:
Mise à jour de moi
Une autre version:
la source
Manière XSLT:
la source
si "il y a beaucoup de balises de version dans le xml", vous feriez mieux d'oublier de le faire avec des "outils simples" et des expressions rationnelles, cela ne suffira pas.
essayez ce python (pas de dépendances):
la source
Voici un one-liner utilisant sed:
la source
<version>
s supplémentaires ne peuvent être que dans les dépendances.awk fonctionne très bien sans utiliser d'outils supplémentaires.
cat pod.xml
moyen simple et lisible pour obtenir la valeur du
<packaging>
tag:la source
Ici, essayez ceci:
la source
Je sais que votre question dit Linux mais si vous avez besoin de le faire sur Windows sans avoir besoin d'outils tiers tels que vous pouvez le mettre dans un fichier batch, Powershell peut extraire n'importe quel nœud du fichier pom.xml comme ceci :
la source
L'
-n
option évite d'imprimer des lignes qui ne correspondent pas; la première correspondance (/.../
) est sur la ligne avant celle avec le texte voulu; lan
commande passe à la ligne suivante, oùs
extrait les informations pertinentes via un groupe de capture (\(...\)
) et une référence arrière (\1
).p
imprime,q
quitte.la source