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 :

Remplacer une chaine sur 2 lignes avec sed


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 113
    Points : 61
    Points
    61
    Par défaut Remplacer une chaine sur 2 lignes avec sed
    Bonjour,

    Je cherche à remplacer une chaine commencant par <A qui est sur deux lignes par cette meme chaine sur une seule ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ex :
    <B>titi
    <B> 
    <A param = toto>
    tata</A>
     
    me donnerai
    <B>titi
    <B>  
    <A param = toto>tata</A>
    J'ai essayé avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/<A\(.*\)\n\(.*\)<\/A>/<A\1\2<\/A>/g'
    mais ca ne marche pas.

    Des idées ? Merci pour vos réponses

  2. #2
    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
    je sais pas le faire de façon "normale" perso je triche avec un buffer "a"
    je lis les deux lignes, dans un buffer je traite et je remplace à la volée comme ça :

    concrètement de l'occurence 1 à la ligne suivante ici : /toto/N (/!\ c'est un "cut" pas un "copy" concequence :
    le substitute se fait dans le buffeur et pas dans le texte !!! donc il faut faire "ta" pour "paste" le buffer dans le texte. /!\ )


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    francois@francois-laptop:~/boulot$ cat > /tmp/exemple
    <B>titi
    <B> 
    <A param = toto>
    tata</A>
     
    francois@francois-laptop:~/boulot$ sed -e :a -e "/toto/N;s/<A\(.*\)\n\(.*\)<\/A>/<A\1\2<\/A>/g;ta" /tmp/exemple > /tmp/exemplecorrige
    <B>titi
    <B> 
    <A param = toto>tata</A>
    francois@francois-laptop:~/boulot$ rm /tmp/exemplecorrige
    y'a surement mieux mais au moins je m'en sort tjrs en faisant comme ça.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 113
    Points : 61
    Points
    61
    Par défaut
    Merci , cela semble marché sauf pour mon dernier <A de mon fichier ... (et oui car j'en ai plusieurs dans mon fichier )

    J'ai tenté d'adapté ton code à mes besoins :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e :a -e "/<A/N;s/<A\(.*\)\n\(.*\)<\/A>/<A\1\2<\/A>/g;ta" /tmp/exemple > /tmp/exempleok
    Pour infos, toto est variable ...

    Ou ai-je fait une erreur ?

    Merci de ton aide

  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 ça passe même avec plusieurs occurrences :
    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
    francois@francois-laptop:~/boulot$ cat > /tmp/exemple
    <B>titi
    <B> 
    <A param = toto>
    tata</A>
     
    <B>titi
    <B> 
    <A param = toto>
    tata</A>
     
    francois@francois-laptop:~/boulot$ sed -e :a -e "/<A/N;s/<A\(.*\)\n\(.*\)<\/A>/<A\1\2<\/A>/g;ta"  /tmp/exemple
    <B>titi> = toto>
    <B> 
    <A param = toto>tata</A>
     
    <B>titi
    <B> 
    <A param = toto>tata</A>
     
    francois@francois-laptop:~/boulot$ rm /tmp/exemple
    francois@francois-laptop:~/boulot$
    doit y avoir un caractère à protéger par un "\"ou une truc comme ça...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 113
    Points : 61
    Points
    61
    Par défaut
    Non, c juste que le toto est variable et donc que <A param = toto> n'est pas fixe. Ce qui est fixe est <A

    Voici un autre exemple, pour mieux comprendre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <A param = toto>
    tata</A>
    <B>titi
    <B> 
    <A coucou = tata>
    tata</A>
    <B>tonton
    <B>
    <A>
    test
    </A>
    doit me donner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <A param = toto>tata</A>
    <B>titi
    <B> 
    <A coucou = tata>tata</A>
    <B>tonton
    <B>
    <A>test</A>

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 90
    Points : 111
    Points
    111
    Par défaut de 2 lignes vers 1...
    Si il faut aller de 2 lignes sur une alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 'N;s/\(<A.*>\)\n\(.*<\/A>\)/\1\2/g;P;D'
    Mais dans un exemple tu dis :
    <A>
    test
    </A>
    Ca c'est sur 3 lignes et donc la solution donnée plus haut ne fonctionnera pas.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 113
    Points : 61
    Points
    61
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 'N;s/\(<A.*\)\n/\1/g;P;D;'
    Ca marche nickel !

    Merci

  8. #8
    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
    quand on te donne un exemple faut aussi chercher un peu à coté sinon on apprend rien -- faut pas attendre de solutions toutes faites.

    tu devrais comprendre que les deux A que tu traites ne sont pas identiques
    l'un est un A paramètre truc /A et l'autre un A truc /A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    francois@francois-laptop:~/boulot$ cat t
    <A param = toto>
    tata</A>
    <B>titi
    <B> 
    <A coucou = tata>
    tata</A>
    <B>tonton
    <B>
    <A>
    test
    </A>
    par conséquent il te faut 2 traitements 1 pour chaque cas !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    sed -e "/<A/N;s/\(<A.*\)\n/\1/g;P;D;/<A>/N;s/\(<A.*\)\n\n/\1/g;P;D;" t
    <A param = toto>tata</A>
    <B>titi
    <B> 
    <A coucou = tata>tata</A>
    <B>tonton
    <B>
    <A>test
    </A>
    francois@francois-laptop:~/boulot$ rm t
    je te laisse finir le travail d'adaptation si tu as une autre syntaxe encore il te faut un 3ième traitement et ainsi de suite...

    aller un effort on va pas non-plus télécharger ton fichier source et te le traiter quand même

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 113
    Points : 61
    Points
    61
    Par défaut
    il faut toutefois d'abord rechercher pour comprendre l'exemple !

    Merci encore pour ton aide

  10. #10
    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
    je t'en prie, et bon courage avec sed, c'est puissant mais casse pied à utiliser

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/09/2007, 17h58
  2. Réponses: 2
    Dernier message: 29/08/2007, 12h52
  3. Insérer une ligne avec sed
    Par Olivier Regnier dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 28/06/2007, 14h08
  4. remplacer une chaine de caractères avec sed
    Par salseropom dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 15/05/2007, 14h56
  5. Extraire une valeur d'une ligne avec sed
    Par jojolepabo dans le forum Linux
    Réponses: 6
    Dernier message: 27/10/2004, 09h34

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