IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Souci avec awk et RS


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut Souci avec awk et RS
    Bonjour,

    J'essaye d'utiliser awk pour effacer une section <property>...toto...</property> dans un fichier xml

    Pour l'instant j'ai trouvé la syntaxe suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -v RS='<property>' '$0 !~ /toto/{print $0}'
    Cela marche presque, la section qui m'intéresse est bien supprimée, mais toutes les autres sections qui ne contiennent pas "toto" se retrouvent amputées de la ligne <property> qui a servi à détecter le motif.

    J'ai donc essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -v RS='<property>' '$0 !~ /toto/{print RS $0}'
    Cela rétablit les lignes amputées, mais sans l'indentation, et surtout la partie du fichier qui précède la première occurence se retrouve préfixée par <property>... logique.


    Je ne vois donc pas comment utiliser RS sans altérer le texte d'origine en dehors de la section recherchée.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Bonjour,

    tu as oublié de nous donner un échantillon représentatif du fichier à traiter.

    les intervalles, c'est plutôt un travail pour sed.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    tu as oublié de nous donner un échantillon représentatif du fichier à traiter.

    les intervalles, c'est plutôt un travail pour sed.
    J'ai pas trouvé de méthode prometteuse avec sed... mais pourquoi pas

    Pour un échantillon :

    Avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    <list>
    <property>
         <untruc>titi</untruc>
         <autrestrucs>
            ....
         </autrestrucs>
    </property>
    <property>
         <untruc>toto</untruc>
         <autrestrucs>
            ....
         </autrestrucs>
    </property>
    <property>
         <untruc>tata</untruc>
         <autrestrucs>
            ....
         </autrestrucs>
    </property>
    </list>
    Après:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    <list>
    <property>
         <untruc>titi</untruc>
         <autrestrucs>
            ....
         </autrestrucs>
    </property>
    <property>
         <untruc>tata</untruc>
         <autrestrucs>
            ....
         </autrestrucs>
    </property>
    </list>

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    sed '/<property>/{:to;N;/<\/property>/! bto; /toto/d}' fichier.xml
    <list>
    <property>
         <untruc>titi</untruc>
         <autrestrucs>
            ....
         </autrestrucs>
    </property>
    <property>
         <untruc>tata</untruc>
         <autrestrucs>
            ....
         </autrestrucs>
    </property>
    </list>
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Merci ça marche sur l'exemple, sur mon fichier réel c'est un bloc comme celui en gras qui est supprimé. J'essaye de comprendre la différence avec mon exemple...

    <property>
    <truc>...</truc>
    <truc>toto</truc>
    <truc>...</truc>
    </property>
    <property>

    <truc>...</truc>
    <truc>...</truc>
    <truc>...</truc>

    Par contre le niveau de la syntaxe est peu chaud pour moi. Est-ce que tu pourrais expliquer le rôle de chaque partie ou me renvoyer vers les éléments de syntaxe qui sont utilisés (même ça j'ai du mal à les identifier par rapport à ce qu'on trouve dans le man)

  6. #6
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed "/>toto</d" fichier.xml
    ca marche pas ?

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    est-ce que ça pourrait venir de ton fichier ? sur quel OS a-t-il été créé ?

    j'ai un peu modifié le fichier traité pour mettre en évidence quelles balises étaient supprimées, et je ne vois pas le problème que tu mentionnes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    sed '/<property/{:to;N;/<\/property/! bto; /toto/d}' fichier.xml
    <list>
    <property titi>
         <untruc>titi</untruc>
         <autrestrucs>
            ....
         </autrestrucs>
    </property titi>
    <property tata>
         <untruc>tata</untruc>
         <autrestrucs>
            ....
         </autrestrucs>
    </property tata>
    </list>
    : label
    Label for b and t commands.

    b label
    Branch to label; if label is omitted, branch to end of script.

    N
    Read/append the next line of input into the pattern space.

    d
    Delete pattern space. Start next cycle.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Voici une méthode s'appuyant sur awk:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    awk '
    /<property>/ { i++ }
    /toto/ { x=1 }
    /<\/property>/ {
      i--
      b=sprintf("%s%s",b,$0)
      if(i==0 && x!=1) print b
      b=""
      x=0
      next
    }
    {
      if(i==0) print
      else b=sprintf("%s%s\n",b,$0)
    }
    ' fichier.xml
    <list>
    <property>
         <untruc>titi</untruc>
         <autrestrucs>
            ....
         </autrestrucs>
    </property>
    <property>
         <untruc>toto</untruc>
         <autrestrucs>
            ....
         </autrestrucs>
    </property>
    <property>
         <untruc>tata</untruc>
         <autrestrucs>
            ....
         </autrestrucs>
    </property>
    </list>
    Les variables utilisés sont:
    x -> propriété a exclure si egal à 1
    i -> niveau d'imbrication des propriétés
    b -> tampon stockant la propriété analysée.

  9. #9
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour
    Citation Envoyé par tnarol Voir le message
    Merci ça marche sur l'exemple, sur mon fichier réel c'est un bloc comme celui en gras qui est supprimé. J'essaye de comprendre la différence avec mon exemple...

    <property>
    <truc>...</truc>
    <truc>toto</truc>
    <truc>...</truc>
    </property>
    <property>

    <truc>...</truc>
    <truc>...</truc>
    <truc>...</truc>

    Par contre le niveau de la syntaxe est peu chaud pour moi. Est-ce que tu pourrais expliquer le rôle de chaque partie ou me renvoyer vers les éléments de syntaxe qui sont utilisés (même ça j'ai du mal à les identifier par rapport à ce qu'on trouve dans le man)
    C'est pas pour être désagréable, mais si on efface le gras, il n'y a pas de différence entre

    <property>
    <truc>...</truc>
    <truc>toto</truc>
    <truc>...</truc>
    </property>
    <property>

    <truc>...</truc>
    <truc>...</truc>
    <truc>...</truc>

    <property>
    <truc>...</truc>
    <truc>toto</truc>
    <truc>...</truc>
    </property>

    <property>
    <truc>...</truc>
    <truc>...</truc>
    <truc>...</truc>

    Ce n'est pas le script qui est faux, c'est ton interprétation.

Discussions similaires

  1. souci avec ma commande awk
    Par étoile de mer dans le forum Linux
    Réponses: 1
    Dernier message: 29/08/2010, 15h57
  2. Soucis avec awk (encore)
    Par miketidy dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 19/06/2008, 09h46
  3. quelques soucis avec word 2000
    Par ramchou dans le forum Word
    Réponses: 3
    Dernier message: 06/09/2004, 18h13
  4. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 16h52
  5. Réponses: 4
    Dernier message: 16/02/2003, 12h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo