• # Perl

    Posté par (page perso) . Évalué à 5.

    Il faut utiliser la fonctionnalité quotemeta de Perl, \Q dans une regex ou fonction quotemeta(). Il faut aussi mettre des guillemets et non des apostrophes. Exemple

    echo $string1 | perl -pe "s/\Q$string1/$string2/g"

    • [^] # Re: Perl

      Posté par . Évalué à 1.

      Merci, ta solution marche très bien. Mais je préferre la solution de bernie ;)

      • [^] # Re: Perl

        Posté par (page perso) . Évalué à 3.

        Pas de soucis. Dès que sed atteint ses limites, il faut penser à Perl qui en modifiant pas grand chose marche souvent (pas toujours).

  • # Quotes autour de la variable

    Posté par . Évalué à 2.

    Salut,

    Il te faut "quoter" ta variable.

    Dans la première partie du sed s/$string1/ c'est une expression rationnelle et le $ est interprété comme une fin de ligne puis string1 est une chaine de caractères interprétée tel quel qui suit la fin de ligne.
    Dans la deuxième partie du sed /$string2/g $string2 est interprétée comme une chaine de caractères.

    Je ne sais pas si on peut remplacer facilement la première partie par une variable du shell. J'en doute car on attend ici une regex. J'ai donc utilisé '\' pour l'exemple, l'idée étant de remplacer l'anti-slash (doublé car \ est un caractère d'échappement).

    Pour la seconde partie c'est plus simple (note les quotes autour de $str) :

    str='|'
    string1='c:\windows\toto'
    
    echo "$string1" | sed -e 's/\\/'$str'/g'
    c:|windows|toto

    A+

  • # Autre approche, toujours avec bash

    Posté par . Évalué à 4.

    Salut Kangs,

    je ne suis pas un spécialiste du shell, donc le reste est à prendre avec des pincettes :)

    • d'après le shebang, tu utilises bash
    • comme tu utilises le flag "/g" de sed, je suppose que tu veux remplacer toutes les occurrences et non pas seulement la première (même si dans ton cas précis ça ne change rien)

    Deux petits détails, à mon avis :

    • sed n'est pas ce que tu cherches je pense, car il s'attend à avoir une regex et non une chaine de caractères basique (comme le fait remarquer biband)
    • Je suis aussi d’accord avec biband sur un autre point : tu as des soucis "d'échappement". Àmha bash, ou n'importe quel shell d'ailleurs, ne t'aide pas trop sur ce point.

    Il faut noter que les doubles quotes (") et les simples quotes (') n'ont pas la même signification pour bash (cf. http://wiki.bash-hackers.org/syntax/quoting). Dans ton cas, tu aurais tout intérêt je pense à utiliser du strong quoting donc des simples quotes, pour éviter les problèmes liés au backslash, qui lui aussi a une signification spéciale.

    Pour la substitution en elle-même, si on considère que sed n'est pas la solution, et que tu utilises bash, ce dernier te permet de faire une substitution basique (http://tldp.org/LDP/abs/html/string-manipulation.html - "Substring replacement")

    Dernier point, je pense que le "exit" à la fin de ton script n'a pas d'effet particulier s'il n'y a plus de code derrière. Il n'est donc pas nécessaire dans ce cas.

    Le script pourrait alors s'écrire :

    #!/bin/bash
    string1='c:\windows\toto'
    string2=rien 
    
    echo "remplace '$string1' par '$string2'"
    echo ${string1//"$string1"/$string2}

    Résultat :

    remplace 'c:\windows\toto' par 'rien'
    rien
    

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.