#!/bin/bash
string1="c:\windows\toto"
string2=rien
echo "remplace '$string1' par '$string2'"
echo $string1 | sed -e 's/$string1/$string2/g'
exit
Ce code ne marche pas, j'ai essayé 50 truc sans résultats.
Comment faire pour remplacer une chaîne contenant des slashs ?
Merci.
# Perl
Posté par Sytoka Modon (site web personnel) . É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 Kangs . Évalué à 1.
Merci, ta solution marche très bien. Mais je préferre la solution de bernie ;)
[^] # Re: Perl
Posté par Sytoka Modon (site web personnel) . É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 biband . É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 puisstring1
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
) :A+
# Autre approche, toujours avec bash
Posté par bernie . Évalué à 4.
Salut Kangs,
je ne suis pas un spécialiste du shell, donc le reste est à prendre avec des pincettes :)
Deux petits détails, à mon avis :
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 :
Résultat :
[^] # Re: Autre approche, toujours avec bash
Posté par Kangs . Évalué à 1.
Super !
Merci beaucoup.
[^] # Re: Autre approche, toujours avec bash
Posté par Space_e_man (site web personnel) . Évalué à 0. Dernière modification le 02 mai 2016 à 14:23.
S'il fallait pouvoir ensuite l'appliquer à tout un fichier…
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.