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 :

Remplacement spécial de string dans un fichier


Sujet :

Shell et commandes GNU

  1. #1
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut Remplacement spécial de string dans un fichier
    Bonjour,

    J'aurais besoin de remplacer des chaînes dans un fichier.

    Je souhaiterais préfixer pour les lignes commençant par DOC_AVAILABLE_LANGUAGE les valeurs situées après les deux points.
    Un extrait du fichier (qui est bien plus gros en réalité) :

    VdkVgwKey: /ec/prod/server/docserver/u002/home/docdgtp/documents/au/2007/0920/TRA-20070920123446342
    COLL_NAME: DOCAU
    DOC_LANGUAGE: AU
    DOC_LANG_SOURCE: FR
    DOC_TITLE: Le Consensus européen pour le développement
    DOC_STATUS:
    DOC_KEY_WORDS:
    DOC_AUTHOR: campoem
    DOC_TRANSLATOR:
    DOC_REVISOR:
    TRANS_INT_EXT: 1
    UPDATE_DATE: 20-Sep-2007 12:00:00 am
    REQ_CODE: DEV
    REQ_SERVICE: IE/CE/DEV/A/04
    REQ_ORIGINE:
    DOC_TYPE: TRA
    DOC_FORMAT: DOC
    DOC_LANG_AVAILABLE: FR AU
    REQ_YEAR: 2007
    DOC_NUMBER: 181
    DOC_VERSION: 0
    DOC_PART: 0
    DOC_SIZE: 302080
    <<EOD>>
    VdkVgwKey: /ec/prod/server/docserver/u002/home/docdgtp/documents/au/2007/0911/ORI-20070911124118280
    COLL_NAME: DOCAU
    DOC_LANGUAGE: AU
    DOC_LANG_SOURCE: IW
    DOC_TITLE: G/TBT/N/ISR/186 - text of project - Playground equipment
    DOC_STATUS:
    DOC_KEY_WORDS:
    DOC_AUTHOR: VERHELLEN Nadine +58749 B100 06/037 ENTR/C/03
    DOC_TRANSLATOR:
    DOC_REVISOR:
    TRANS_INT_EXT: 0
    UPDATE_DATE: 19-Sep-2007 12:00:00 am
    REQ_CODE: ENTR
    REQ_SERVICE: IE/CE/ENTR/C/03
    REQ_ORIGINE:
    DOC_TYPE: ORI
    DOC_FORMAT: PDF
    DOC_LANG_AVAILABLE: IW EN
    REQ_YEAR: 2007
    DOC_NUMBER: 1767
    DOC_VERSION: 0
    DOC_PART: 0
    DOC_SIZE: 37130
    <<EOD>>
    VdkVgwKey: /ec/prod/server/docserver/u002/home/docdgtp/documents/au/2007/0830/ORI-20070830094004034
    COLL_NAME: DOCAU
    DOC_LANGUAGE: AU
    DOC_LANG_SOURCE: AR
    DOC_TITLE: G/TBT/N/QAT/25 - HONEY PRODUCED BY HONEY BEES
    DOC_STATUS:
    DOC_KEY_WORDS:
    DOC_AUTHOR: lichdbe
    DOC_TRANSLATOR:
    DOC_REVISOR:
    TRANS_INT_EXT: 0
    UPDATE_DATE: 19-Sep-2007 12:00:00 am
    REQ_CODE: ENTR
    REQ_SERVICE: IE/CE/ENTR/C/03
    REQ_ORIGINE:
    DOC_TYPE: ORI
    DOC_FORMAT: PDF
    DOC_LANG_AVAILABLE: AR EN
    REQ_YEAR: 2007
    DOC_NUMBER: 1679
    DOC_VERSION: 0
    DOC_PART: 0
    DOC_SIZE: 16500
    <<EOD>>
    Et le résultat à obternir :

    VdkVgwKey: /ec/prod/server/docserver/u002/home/docdgtp/documents/au/2007/0920/TRA-20070920123446342
    COLL_NAME: DOCAU
    DOC_LANGUAGE: AU
    DOC_LANG_SOURCE: FR
    DOC_TITLE: Le Consensus européen pour le développement
    DOC_STATUS:
    DOC_KEY_WORDS:
    DOC_AUTHOR: campoem
    DOC_TRANSLATOR:
    DOC_REVISOR:
    TRANS_INT_EXT: 1
    UPDATE_DATE: 20-Sep-2007 12:00:00 am
    REQ_CODE: DEV
    REQ_SERVICE: IE/CE/DEV/A/04
    REQ_ORIGINE:
    DOC_TYPE: TRA
    DOC_FORMAT: DOC
    DOC_LANG_AVAILABLE: lang_FR lang_AU
    REQ_YEAR: 2007
    DOC_NUMBER: 181
    DOC_VERSION: 0
    DOC_PART: 0
    DOC_SIZE: 302080
    <<EOD>>
    VdkVgwKey: /ec/prod/server/docserver/u002/home/docdgtp/documents/au/2007/0911/ORI-20070911124118280
    COLL_NAME: DOCAU
    DOC_LANGUAGE: AU
    DOC_LANG_SOURCE: IW
    DOC_TITLE: G/TBT/N/ISR/186 - text of project - Playground equipment
    DOC_STATUS:
    DOC_KEY_WORDS:
    DOC_AUTHOR: VERHELLEN Nadine +58749 B100 06/037 ENTR/C/03
    DOC_TRANSLATOR:
    DOC_REVISOR:
    TRANS_INT_EXT: 0
    UPDATE_DATE: 19-Sep-2007 12:00:00 am
    REQ_CODE: ENTR
    REQ_SERVICE: IE/CE/ENTR/C/03
    REQ_ORIGINE:
    DOC_TYPE: ORI
    DOC_FORMAT: PDF
    DOC_LANG_AVAILABLE: lang_IW lang_EN
    REQ_YEAR: 2007
    DOC_NUMBER: 1767
    DOC_VERSION: 0
    DOC_PART: 0
    DOC_SIZE: 37130
    <<EOD>>
    VdkVgwKey: /ec/prod/server/docserver/u002/home/docdgtp/documents/au/2007/0830/ORI-20070830094004034
    COLL_NAME: DOCAU
    DOC_LANGUAGE: AU
    DOC_LANG_SOURCE: AR
    DOC_TITLE: G/TBT/N/QAT/25 - HONEY PRODUCED BY HONEY BEES
    DOC_STATUS:
    DOC_KEY_WORDS:
    DOC_AUTHOR: lichdbe
    DOC_TRANSLATOR:
    DOC_REVISOR:
    TRANS_INT_EXT: 0
    UPDATE_DATE: 19-Sep-2007 12:00:00 am
    REQ_CODE: ENTR
    REQ_SERVICE: IE/CE/ENTR/C/03
    REQ_ORIGINE:
    DOC_TYPE: ORI
    DOC_FORMAT: PDF
    DOC_LANG_AVAILABLE: lang_AR lang_EN
    REQ_YEAR: 2007
    DOC_NUMBER: 1679
    DOC_VERSION: 0
    DOC_PART: 0
    DOC_SIZE: 16500
    <<EOD>>
    J'ai regardé du côté de la commande sed mais rien de concluant pour le moment, je pense que c'est possible en une ligne de commande ?

    Des idées ?

    Merci d'avance

  2. #2
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    Salut,
    Perl convient bien dans le traitement des fichiers :
    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
    @Elive[/tmp]$ cat test.txt
    DOC_FORMAT: DOC
    DOC_LANG_AVAILABLE: FR AU
    REQ_YEAR: 2007
    DOC_NUMBER: 181
    DOC_VERSION: 0
    DOC_LANG_AVAILABLE: IW EN
    REQ_YEAR: 2007
    DOC_NUMBER: 1767
    DOC_VERSION: 0
     
    @Elive[/tmp]$ perl -pi -e "s/(DOC_LANG_AVAILABLE:) (.*) (.*)/\1 lang_\2 lang_\3/g" test.txt
     
    @Elive[/tmp]$ cat test.txt
    DOC_FORMAT: DOC
    DOC_LANG_AVAILABLE: lang_FR lang_AU
    REQ_YEAR: 2007
    DOC_NUMBER: 181
    DOC_VERSION: 0
    DOC_LANG_AVAILABLE: lang_IW lang_EN
    REQ_YEAR: 2007
    DOC_NUMBER: 1767
    DOC_VERSION: 0

  3. #3
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut
    Merci pour cette aide, on converge.

    J'ai oublié d'indiquer que cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DOC_LANG_AVAILABLE: FR AU
    Peut contenir une liste de language qui différe d'une ligne à l'autre, par exemple dans le même fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    DOC_LANG_AVAILABLE: FR DE GA
    ...
    DOC_LANG_AVAILABLE: FR
    ...
    DOC_LANG_AVAILABLE: FR DE GA SV TR
    ...
    Apparement la commande fonctionne pour un nombre fixe de 2 langues , sinon j'obtiens un résultat comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    DOC_LANG_AVAILABLE: lang_FR DE lang_GA
    ...
    C'est possible en une commande pour ce nombre variable de langues ?

    Merci d'avance

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    C'est parfaitement possible avec un "one-line" sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -r '/^DOC_LANG_AVAIL/ s/ (..)/ lang_\1/g' ton-fichier
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  5. #5
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut
    Citation Envoyé par ripat Voir le message
    C'est parfaitement possible avec un "one-line" sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -r '/^DOC_LANG_AVAIL/ s/ (..)/ lang_\1/g' ton-fichier
    J'ai tenté cette commande, en remplaçant le -r (n'existe pas apparement) par -e , et ça me donne une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    bash-2.05$ sed -e '/^DOC_LANG_AVAIL/ s/ (..)/ lang_\1/g' fichier.txt
    sed: command garbled: /^DOC_LANG_AVAIL/ s/ (..)/ lang_\1/g
    Une erreur dans la commande, mais j'arrive pas à voir où.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    C'est que l'option -r (regexp extended) n'est pas supportée par ta version de sed. Je l'utilise uniquement pour rendre la regex plus lisible. Essaye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed  '/^DOC_LANG_AVAIL/ s/ \(..\)/ lang_\1/g' fichier
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  7. #7
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut
    Citation Envoyé par ripat Voir le message
    C'est que l'option -r (regexp extended) n'est pas supportée par ta version de sed. Je l'utilise uniquement pour rendre la regex plus lisible. Essaye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed  '/^DOC_LANG_AVAIL/ s/ \(..\)/ lang_\1/g' fichier
    ça me semble tout bon maintenant.

    Un grand merci pour la rapidité et la qualité de votre aide.

    Bonne fin de journée.

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

Discussions similaires

  1. insérer ou remplacer une ligne string dans un fichier texte ?
    Par Night_Wolf1619 dans le forum Débuter
    Réponses: 34
    Dernier message: 16/05/2013, 11h49
  2. [Batch] remplacer une string dans un fichier
    Par yelbied dans le forum Windows
    Réponses: 5
    Dernier message: 12/07/2007, 10h36
  3. remplacer les String dans un fichier
    Par makohsarah dans le forum Langage
    Réponses: 3
    Dernier message: 29/05/2006, 13h34
  4. [VBA-E]Remplacement virgules par tabulation dans un fichier texte
    Par Mlezen dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 03/05/2006, 14h03
  5. Comment enregistrer une string dans un fichier
    Par Dnx dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 23/09/2005, 14h52

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