#1 Le 04/11/2020, à 17:18
- anthonyB
[RESOLU]commande sed: pourvoir remplacer $ et utiliser des variables
Bonjour,
je voudrais utiliser la commande sed de cette manière:
sed -i "s/debut_path_qui_ne_change_pas[a-zA-Z\-\_\.\/0-9]*\${year}/debut_path_qui_ne_change_pas$(echo $var_path_new)\${year}/g" fichier
J'essaie de remplacer la suite du path et le début du fichier par ce qu'il y a dans la variable var_path_new et je veux arreter le changement à partir de ${year} qui ici n'est pas une variable.
Merci d'avance de votre aide
Dernière modification par anthonyB (Le 05/11/2020, à 18:12)
Hors ligne
#2 Le 04/11/2020, à 17:51
- pingouinux
Re : [RESOLU]commande sed: pourvoir remplacer $ et utiliser des variables
Bonjour,
Essaye ceci (j'ai enlevé le -i). Si ça ne convient pas, montre un exemple.
sed "s/\(debut_path_qui_ne_change_pas\)[-a-zA-Z_.\/0-9]*\(\${year}\)/\1$var_path_new\2/g" fichier
Hors ligne
#3 Le 04/11/2020, à 18:10
- Watael
Re : [RESOLU]commande sed: pourvoir remplacer $ et utiliser des variables
dans un cas simple comme celui-ci, je ne m'embête pas :
sed 's/\(debut_path_qui_ne_change_pas\)[-a-zA-Z_.\/0-9]*\(\${year}\)/\1'"$var_path_new"'\2/g' fichier
ça peut devenir illisible quand il y a des imbrication de guillemets et d'apostrophes, mais ce n'est pas le cas ici.
pour sed, le $ indique une fin de ligne, c'est pourquoi, entre apostrophes, il faut quand même le protéger.
est-ce qu'il ne faut pas le protéger davantage entre guillemets ?...
Dernière modification par Watael (Le 04/11/2020, à 18:11)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#4 Le 05/11/2020, à 18:11
- anthonyB
Re : [RESOLU]commande sed: pourvoir remplacer $ et utiliser des variables
Merci pour vos réponses les deux méthodes fonctionnent, j'ai du faire une erreur avec le signe d’échappement \ avec $
Et merci pour l'astuce \(chaine \) \1 pour éviter de tout réécrire
Hors ligne
#5 Le 05/11/2020, à 22:36
- WW
Re : [RESOLU]commande sed: pourvoir remplacer $ et utiliser des variables
Bonjour,
Il est également possible d'utiliser les expressions régulières étendues avec l'option -E, auquel cas il ne faut plus protéger les parenthèses capturantes.
En revanche d'autres caractères se retrouvent avec une signification comme les accolades qu'il faut donc protéger.
sed -i -Ee 's/(debut_path_qui_ne_change_pas)[-a-zA-Z_.\/0-9]*(\$\{year\})/\1'"${var_path_new}"'\2/g' fichier
A noter l'option -e n'est pas obligatoire mais à l'avantage d'augmenter la portabilité. De plus si plusieurs scripts sont passés à sed l'option devient indispensable.
De même délimiter les variables via ${} est une bonne pratique.
Une autre solution assez classique pour travailler avec des expressions régulières est perl qui utilise des regex encore plus riches :
perl -i -pe 's/(debut_path_qui_ne_change_pas)[-\w.\/\d]*(\$\{year\})/\1'"${var_path_new}"'\2/g' fichier
Quand on sait c'est facile, mais qui n'a jamais été débutant.
Hors ligne