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 :

Substitution sed ne fonctionne pas avec le caractère &


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 25
    Par défaut Substitution sed ne fonctionne pas avec le caractère &
    Bonjour,

    J'essaie de faire un code qui permet de remplacer dans un fichier output un ensemble de TAGS dont la correspondance se trouvent dans un fichier de config.

    Le fichier input se présente comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tonton=@tonton@
    tata=@tata@
    un tag à substituer est donc délimité par @


    Le fichier de config qui sert à la substitution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tonton=Daniel
    tata=Charlotte


    Mon code :


    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
    #!/bin/ksh
     
    echo -e "tonton=@tonton@\ntata=@tata@" > input
    cp input output
    echo -e "tonton=Daniel&Henry\ntata=Charlotte" > config
     
     
    while IFS='=' read -r key value
    do 
    	key='@'$key'@'
    	value="`echo \"$value\" | sed -e 's/[\~&]/\\&/g'`" # on echappe les caractères \ ~ &
            echo "substituer $key par $value"
    	sed -i -e "s~$key~$value~g" output
    done < config
     
    echo '-- resultat --'	
    cat output

    Ca fonctionne...
    ... excepté si la valeur qui va venir en remplacement est composée du caractère &, ce qui est possible dans mon cas.
    J'essaie de l'échapper mais rien à faire.

    S'il existe un équivalent Perl qui ignore cette histoire de caractère je suis preneur.
    Merci pour votre aide !

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

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

    rajoute des protections.

    ah, les protections des protections dans les regex de sed, awk, et autres...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    sed n'est pas une obligation, on peut lui préférer les builtins :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    lines="$(<input)"
    while IFS='=' read -r key value; do
            echo "--- substituer \"$key\" par \"$value\""
            lines="${lines/@$key@/$value}"
            echo "$lines"
    done < config

    Edit: j'avais pas fait attention au #!/bin/ksh

    sinon avec Perl j'ai pas rencontré de difficulté particulière personnellement :
    Code Perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    open my $INPUT, "input" or die;
    my $lines = join "", <$INPUT>;
     
    my $delimiter = q(@);
    open my $CONFIG, "config" or die;
    while (my $line = <$CONFIG>) {
            chomp $line;
            my ($token, $value) = split /=/, $line;
            print "--- substituer \"$token\" par \"$value\"\n";
            $token = $delimiter . $token . $delimiter;
            $lines =~ s/$token/$value/g;
            print "$lines";
    }
    au besoin il doit toujours être possible de modifier légèrement soit en rajoutant un $value = qq($value); soit avec un truc du style $lines =~ s/$token/\\Q$value\\E/g (non-testé)

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    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 376
    Par défaut
    Bonjour,
    On peut aussi remplacer toute la boucle par 2 sed imbriqués:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ cat output 
    tonton=@tonton@
    tata=@tata@
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ cat config 
    tonton=Daniel&Henry/shwartz
    tata=Charlotte~aux\fraise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ sed -e 's,[&~/\],\\&,g;s/.*/s\/@&\/g/;s/=/@\//' config | sed -f - output 
    tonton=Daniel&Henry/shwartz
    tata=Charlotte~aux\fraise

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 25
    Par défaut
    Nickel, ta méthode est la plus fiable, et rapide qui plus est.
    Merci !

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

Discussions similaires

  1. Substitution ne fonctionne pas avec cron
    Par jejeman dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 24/10/2012, 16h03
  2. Réponses: 4
    Dernier message: 05/06/2008, 18h14
  3. evenement onclick ne fonctionne pas avec explorer??
    Par nath-0-0 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 15/03/2006, 12h13
  4. Réponses: 7
    Dernier message: 24/01/2006, 11h03
  5. window.resizeTo ne fonctionne pas avec firefox?
    Par FrankOVD dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/06/2005, 15h07

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