Quiero leer un pom.xml ('Modelo de objetos de proyecto' de Maven) y extraer la información de la versión. Aquí hay un ejemplo:
<?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>
¿Cómo puedo extraer la versión '1.0.74-SNAPSHOT' de arriba?
Me encantaría poder hacerlo usando un simple script de bash sed o awk. De lo contrario, se prefiere una pitón simple.
EDITAR
Restricción
La caja de Linux está en un entorno corporativo, por lo que solo puedo usar herramientas que ya están instaladas (no es que no pueda solicitar una utilidad como xml2, pero tengo que pasar por muchos trámites burocráticos). Algunas de las soluciones son muy buenas (ya aprende algunos trucos nuevos), pero pueden no ser aplicables debido al entorno restringido
listado xml actualizado
Agregué la etiqueta de dependencias a la lista original. Esto mostrará que alguna solución hacky puede no funcionar en este caso
Distro
La distribución que estoy usando es RHEL4
Respuestas:
xml2 puede convertir xml a / desde formato orientado a línea:
fuente
Otra forma: xmlgrep y XPath:
Desventaja: lento
fuente
xml_grep
Utilizando
python
Utilizando
xmlstarlet
Utilizando
xmllint
fuente
cat (//x:version)[1]/text()
cuando se usaxmllint
también funciona!Clojure camino. Requiere solo jvm con un archivo jar especial:
Forma Scala:
Manera maravillosa:
fuente
Aquí hay una alternativa en Perl
Funciona con el ejemplo revisado / extendido en las preguntas que tiene múltiples elementos de "versión" a diferentes profundidades.
fuente
Hacky way:
Se basa en la sangría correcta de la requerida
<version>
fuente
<version>
cosas.Encuentre una solución muy torpe y de una sola línea.
El sed al final es muy feo, pero no pude imprimir el texto del nodo solo con Mindom.
Actualización de _Vi :
Versión de Python menos hacky:
Actualización de mi parte
Otra version:
fuente
Forma XSLT:
fuente
si "Hay muchas etiquetas de versión en el xml", entonces es mejor que se olvide de hacerlo con "herramientas simples" y expresiones regulares, eso no funcionará.
prueba este python (sin dependencias):
fuente
Aquí hay una línea usando sed:
fuente
<version>
s adicionales solo pueden estar dentro de las dependencias.awk funciona bien sin usar herramientas adicionales.
cat pod.xml
forma simple y legible de obtener el valor de la
<packaging>
etiqueta:fuente
Aquí, prueba esto:
fuente
Sé que su pregunta dice Linux, pero si tiene la necesidad de hacer esto en Windows sin la necesidad de herramientas de terceros para que pueda colocarlo en un archivo por lotes, Powershell puede extraer cualquier nodo del archivo pom.xml de esta manera. :
fuente
La
-n
opción evita imprimir líneas que no coinciden; first match (/.../
) está en la línea antes de la que tiene el texto deseado; eln
comando salta a la siguiente línea, dondes
extrae información relevante a través de un grupo de captura (\(...\)
) y una referencia inversa (\1
).p
imprime, seq
cierra.fuente