Obtenir le premier où Il n'est pas précisé par le parent
J'ai essayé cela sans succès p> ou ceci mais il capture toujours toute la version: p> Comment obtenir une chaîne des balises à l'aide de SED et Grep
J'essaie de capturer les tags:
et ensuite à partir de là, je suppose que je vais extraire la chaîne: p>
regex avec lookahead négatif sur plusieurs lignes
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" >
<modelVersion>55.0.0</modelVersion>
<parent>
<groupId>org.test.proj</groupId>
<artifactId>test-invoker</artifactId>
<version>invoker.0.4</version>
</parent>
<groupId>org.test.proj.assent</groupId>
<artifactId>mainapp</artifactId>
<version>mainapp.1.4</version>
<packaging>pom</packaging>
<name>main app 1</name>
<properties>
<app-name>Testing App</app-name>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.prod.db</groupId>
<artifactId>srver-db</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
3 Réponses :
avec GNU AWK:
awk '/<project/{next} !s && match($0, /<([a-zA-Z]+)>/, tag){s=1} s && ($0~ "</" tag[1] ">"){s=0} !s && match($0, "<version>([^<]*)</version>", ver) {print ver[1]}' file
WOW si complexe ... Puis-je juste quelques moyens avec une méthode plus simple plus simple? je n'ai pas besoin maintenant du texte intérieur que je vais tuyer avec grep
@ user63898 Considérant Regex CODE> La nature gourmande et la complexité de ce problème, je suppose que ce n'est pas facile ...
très étrange que c'est si complexe, je veux juste obtenir du texte entre les chaînes
@ user63898 Je suppose que c'est pourquoi ils vous suggèrent d'utiliser XML Parser. Et ma solution code> awk code> est en réalité simplifiée en fonction des balises racine fermera code> l'hypothèse.
Si Perl code> est disponible, que diriez-vous:
perl -0777 -ne '
while (m#(<parent>.*</parent>)|(?<=<version>)(.*?)(?=</version>)#sg)
{print $&, "\n" if $& !~ /(^\$|parent)/}' file.xml
-0777 code> option indique
perl code> pour slurp toutes les lignes pour activer la correspondance de modèle sur plusieurs lignes. LI>
$ et code> à l'exclusion des celles qui commencent par "$" ou contient "parent". li>
(? . *)
Longueur variable Lookedehind code> n'est pas implémenté dans
Perl code> (et la plupart des autres langues) à partir de maintenant. LI>
ul> p>
La question indique:
Je peux utiliser uniquement des outils Linux natifs no Installations p> blockquote>
et la version de Linux utilisé est décrite dans un commentaire comme suit: P>
oui la norme AWS Linux P> blockQuote>
Je viens de vérifier et Amazon Linux est livré avec xmllint préinstallé . P>
Par conséquent, une solution semble être la suivante: p>
xxx pré> p>
Pouvez-vous utiliser un Outil d'analyse XML ?
sed code> et
grep code> ne sont pas au courant de la syntaxe XML.
non je ne peux pas pure outils Linux
oui la standard aws linux
@ user63898 Pouvez-vous ajouter un échantillon d'entrée et afficher la chaîne exacte requise comme sortie? Il existe plusieurs balises code>, sur quelle base avez-vous besoin de sélectionner comme sortie? Est-ce la chaîne
celle-ci que j'ai besoin code> ou autre chose? De plus, cette balise peut-elle être sur plusieurs lignes?
ne peut pas donner un exemple réel, mais oui une autre avoir des parents et une chaîne peut être n'importe quelle chose
Toujours pas clair pour moi, exactement
parent code> tag ou
FOO code> et
FOO2 code> sont également des balises parent ici?
libxslt ou libxml2 peut être installé ou disponible: aws.amazon.com/ Amazon-Linux-Ami / 2018-03-packages puis vous pouvez essayer des choses comme: SuperUserSer.com/Questions/266641/...
J'ai mis à jour la question
N'utilisez pas d'expressions régulières pour analyser XML. Ou au moins, lisez Stackoverflow.com/Questtions/1732348/... Vous savez donc ce que vous faites.
je ne vais pas lire tout cela..mais ce cas est très spécifique à ne pas être général ou grand simplement cherche un moyen rapide pour faire le travail