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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 113
    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 confirmé 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 : 49
    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
    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 confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 113
    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 confirmé 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 : 49
    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
    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 confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 113
    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 confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 90
    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.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/09/2007, 18h58
  2. Réponses: 2
    Dernier message: 29/08/2007, 13h52
  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, 15h08
  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, 15h56
  5. Extraire une valeur d'une ligne avec sed
    Par jojolepabo dans le forum Linux
    Réponses: 6
    Dernier message: 27/10/2004, 10h34

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