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

Unix Discussion :

Aide sur ligne de commande sed


Sujet :

Unix

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut Aide sur ligne de commande sed
    Bonjour,

    J'ai un fichier XML importé sous unix qui contient 2 lignes. Le fichier s'appelle fichier.xml.
    La première ligne contient la ligne d'en-tête XML, référence du codage.
    La seconde contient les balises "à la queue-leu-leu" (tout le monde s'éclate...) avec les valeurs.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?xml version="1.0" encoding="UTF-8"?>
    <XML><TETE>xperia</TETE> [...] <FLD id=":>2</FLD></XML>
    Après une suite de grep/cut et de sed en tous genres, il me reste à supprimer la chaîne de caractères Il y a un 2 comme valeur mais ça pourrait être n'importe quelle valeur. Disons que dans un premier temps, je souhaiterais déjà supprimer cette chaîne de caractères avec le 2 en dur.

    J'ai écrit ça (ksh) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i '/id=\":/{s/\<FLD id=\":\>2\<\/FLD\>//g}' fichier.xml
    J'ai mis des backslashes devant les " mais je crois pas que ce soit utile pour le sed (par contre, j'ai vu que pour la commande grep, on ne pouvait pas s'en passer).

    En testant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s/\<FLD id=\":\>2\<\/FLD\>//g
    directement dans le fichier, ça ne me donne rien non plus (heureusement). J'ai testé avec les espaces en cherchant sur , il exécute bien la commande directement dans le fichier. Après comme on est en "batch", je sais pas si ça réagit de la même façon.

    Du coup, si vous avez envie de me fournir un peu d'aide (et si possible des explications), je vous en saurai gré.

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Bonjour,

    J'ai pas tout compris, donc je vais juste commenter ce que j'ai compris:
    -L'option "-i" de sed modifie directement le(s) fichier(s) d'entrée.
    -Si tu n'as qu'une seule ligne, pas super utile de faire une recherche de pattern avant de faire le replace et en plus à part pour de l'optimisation, le replace suffit car il fait lui même la recherche.
    Cordialement.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    Bonjour,

    Oui (copié/collé de lignes précédentes) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 's/\<FLD id=\":\>2\<\/FLD\>//g' fichier.xml

    Edit : je remets le -i sinon il n'y a pas d'écriture en sortie dans fichier.xml.

  4. #4
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    si tu as plusieurs grep/cut et autres manipulations comme ça... il est probablement plus pertinant de faire un seul et unique sed ou awk equivalant à l'ensemble des modifications....

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    Bonjour,

    Merci pour ton message mais ce n'est pas possible. Chaque balise a son sed et chacune à son conditionnement. Je ne cherche pas à optimiser mais à faire marcher le remplacement, objet du présent poste.

    Donc, si tu as une proposition pour le remplacement que je cherche à faire, n'hésite surtout pas

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Ce n'était pas super clair que cela ne fonctionnait pas le replace.
    Peux-tu nous dire sous quel OS tu es et si possible ta version de sed ?

    Mais si ton replace ne fonctionne pas, je pense que c'est à cause des "\" entoure les '<' et '>' car en général, dans une regex, cela ne symbolise pas le caractères '<' et '>' mais le début et le fin de mot.

    Essaie donc comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 's/<FLD id=":>2<\/FLD>//g' fichier.xml
    ou plus simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 's#<FLD id=":>2</FLD>##g' fichier.xml
    Ici, j'ai juste utilisé un caractère non utilisé pour remplacer l'habituel '/' qui lui est utilisé en tant que caractère.
    Et le connecteur 'g' n'est utile que si tu as plusieurs remplacement à faire sur la même ligne.
    Cordialement.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    Bonjour,

    Version OS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    admin-/tmp> uname -r
    2.6.32-279.2.1.el6.x86_64
    admin-/tmp> uname -a
    Linux orhdvasl08 2.6.32-279.2.1.el6.x86_64 #1 SMP Thu Jul 5 21:08:58 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux
    Version sed
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    admin-/tmp> sed --version
    GNU sed version 4.2.1
    Copyright (C) 2009 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
    to the extent permitted by law.
    J'avais déjà testé la ligne que tu m'as fournie mais elle ne fonctionne pas.

  8. #8
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Ton post devrait plutot être ici:
    http://www.developpez.net/forums/f36...commandes-gnu/

    Donc, si tu pouvais le déplacer...

    Sinon, il va falloir que tu nous fournisses le fichier que tu veux traiter car chez moi, cela fonctionne comme je te l'ai déjà indiqué:
    Le fichier à traiter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ cat fichier.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <XML><TETE>xperia</TETE> [...] <FLD id=":>2</FLD></XML>
    La version avec tous les échappements qui ne fonctionne pas pour les raisons déjà expliquées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ sed 's/\<FLD id=\":\>2\<\/FLD\>//g' fichier.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <XML><TETE>xperia</TETE> [...] <FLD id=":>2</FLD></XML>
    La version avec juste les échappements utils qui fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ sed 's/<FLD id=":>2<\/FLD>//g' fichier.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <XML><TETE>xperia</TETE> [...] </XML>
    Et si les changements se produise bien sans l'option '-i', avec l'option cela fonctionnera aussi directement dans le fichier (sauf si tu n'as pas les droits...)
    Cordialement.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    Bonjour,

    Je t'ai envoyé le contenu du fichier en mp.

    Merci pour ton aide.

  10. #10
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Bah, cela fonctionne aussi avec le fichier que tu m'as envoyé via un copier/coller (donc possible qu'il soit modifier).

    Peux-tu essayer ceci et dire si tu as le même résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ echo '<BOB><BIB><FLD id=":>2</FLD></BIB></BOB>' |  sed 's/<FLD id=":>2<\/FLD>//g'
    Tu devrais obtenir ceci:
    Et si c'est le cas, et que cela ne fonctionne pas avec ton fichier, c'est que celui-ci est transformer par le copier/coller, il faut donc voir sont contenu de façon non ambigu via un command sed par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ sed -n -l80 'l' fichier.xml
    Ceci affichera le fichier sur 80 colonnes en montrant les caractères spéciaux.
    Cordialement.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    Bonjour,

    La commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ echo '<BOB><BIB><FLD id=":>2</FLD></BIB></BOB>' |  sed 's/<FLD id=":>2<\/FLD>//g'
    fonctionne très bien. En ce sens, elle renvoie le résultat attendu.

    Le fichier source contient deux lignes :
    - une ligne pour la méthode de codage XML
    - une ligne de données

    Grâce à la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ sed -n -l80 'l' fichier.xml
    Au passage, il sert à quoi le 'l' dans cette commande ?

    Le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?xml version="1.0" encoding="UTF-8"?>$ pour la première ligne
    <XML>[...]</XML>$ pour la deuxième ligne
    Le fichier vient de windows. J'ai fait un dos2unix mais ça ne suffit pas.
    En supprimant le retour chariot entre les deux lignes et en le rétablisasnt manuellement, la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 's/<FLD id=":>2<\/FLD>//g' fichier.xml;
    renvoie le résultat attendu

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Comme précisé précédemment, le 'l' de la commande sed, affiche la ligne courante de façon non ambigu (on voit donc les caractères tel que la tabulation en "\t" au lieu de n espace on voit aussi les caractère non imprimable par leur code octal.

    Sinon, je doute que cela soit le fait de retirer et de remettre manuellement le retour chariot qui fasse que cela fonctionne.
    Avec quel éditeur de texte as-tu fait cette action ?
    Il se peut que cela soit l'éditeur qui a modifié le format de départ lors de l'enregistrement.
    Cordialement.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Avec quel éditeur de texte as-tu fait cette action ?
    vi

    Citation Envoyé par disedorgue Voir le message
    Il se peut que cela soit l'éditeur qui a modifié le format de départ lors de l'enregistrement.
    Citation Envoyé par disedorgue Voir le message
    Sinon, je doute que cela soit le fait de retirer et de remettre manuellement le retour chariot qui fasse que cela fonctionne.
    Effectivement, toute modification puis enregistrement du fichier postérieur à l'exécution du script permet d'obtenir le résultat attendu par la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 's/<FLD id=":>2<\/FLD>//g' fichier.xml;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide sur OLE pour commander MS IE
    Par Strych9 dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 13/01/2011, 11h25
  2. besoin d'aide sur envoi de commande par script SSH
    Par threepwood dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 16/03/2010, 17h52
  3. Réponses: 4
    Dernier message: 05/11/2009, 11h42
  4. extraire une partie de chaine avec une seule ligne de commande sed
    Par kinkichin dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 07/07/2009, 10h28
  5. [Newbie] Aide sur ligne de commande…
    Par Mister Paul dans le forum Linux
    Réponses: 5
    Dernier message: 06/05/2009, 09h07

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