0
votes

Obtenir une chaîne des balises à l'aide de SED et Grep

mise à jour 2 forte> Je pense avoir besoin de quelque chose de simple que ceci:
regex avec lookahead négatif sur plusieurs lignes

Obtenir le premier où Il n'est pas précisé par le parent J'ai essayé cela sans succès p> xxx pré>

ou ceci mais il capture toujours toute la version: p> xxx pré>

Comment obtenir une chaîne des balises à l'aide de SED et Grep J'essaie de capturer les tags: org.test.proj.assent groupid> Maintapp artifactide> MainApp.1.4 Version> POM Emballage> App principale 1 nom> code> p>

et ensuite à partir de là, je suppose que je vais extraire la chaîne: p>

 <?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>


10 commentaires

Pouvez-vous utiliser un Outil d'analyse XML ? sed et grep 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 , sur quelle base avez-vous besoin de sélectionner comme sortie? Est-ce la chaîne celle-ci que j'ai besoin 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 tag ou FOO et FOO2 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


3 Réponses :


0
votes

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


4 commentaires

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 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 awk est en réalité simplifiée en fonction des balises racine fermera l'hypothèse.



0
votes

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>
  • La regex correspond aux deux motifs: .. parent> code> et .. Version> code>. Le but du premier est de ne pas faire correspondre avec code> étiquette dans code> tag. Li>
  • Enfin, il imprime la sous-chaîne correspondante $ et code> à l'exclusion des celles qui commencent par "$" ou contient "parent". li>
  • Si nous pouvions dire quelque chose comme (? . *) .. code> comme vous le mentionnez, ce serait beaucoup plus simple. Malheureusement, Longueur variable Lookedehind code> n'est pas implémenté dans Perl code> (et la plupart des autres langues) à partir de maintenant. LI> ul> p>


0 commentaires

0
votes

La question indique:

Je peux utiliser uniquement des outils Linux natifs no Installations

et la version de Linux utilisé est décrite dans un commentaire comme suit:

oui la norme AWS Linux

Je viens de vérifier et Amazon Linux est livré avec xmllint préinstallé .

Par conséquent, une solution semble être la suivante: xxx


0 commentaires