Quoting (was interpreter $var mais pas !d)

Daniel C ml at editionsdidier.com
Wed Aug 30 19:17:54 CEST 2006


Bruno Bonfils wrote:
> Daniel, je te sens motivé pour commencer la section [1], qu'en penses tu
> ? :)
> 
> [1] http://cli.asyd.net/home/shell/common/quoting 

Bon, j'ai essayé de pondre un petit qqchose, mais ça me parait vraiment basique...

Je vous laisse corriger (on sait jamais), reformuler (si besoin) et surtout ajouter...

Je suis tombé hier sur un autre cas bizarre que j'ai dû contourner.
Je n'ai plus l'exemple précis, mais en gros, c'était

var=toto
result="$(echo -e "titi\ntoto\ntutu" | sed -e '/$var/ !d')"

le !d était interprêté (par la dernière commande de l'historique qui commence par d) et quoi que je fasse, le !d était toujours interprêté à cause des 
" extérieurs (indispensable pour que le $() soit exécuté.

J'ai modifié mes commandes pour contourner le pb, et je me suis aperçu ensuite que l'on pouvait passer par une variable intermédiaire :
var=toto
exp="/$var"'/!d'
result="$(echo -e "titi\ntoto\ntutu" | sed -e $exp)"

Daniel

PS: concernant sed, quelqu'un peut-il expliquer pourquoi les parenthèses capturantes doivent être échappées, sinon elles prennent le rôle du caractère 
parenthèse. En général, tous les caractères ayant un sens particulier dans les regexp doivent être échappés pour redevenir de "simples caractères". 
Dans sed aussi, sauf pour les parenthèses.

 >echo "un texte (entre parenthèses) avec aussi des 'apostrophes'."| sed -e 's/(/#/'
un texte #entre parenthèses) avec aussi des 'apostrophes'.
# la parenthèse est bien un caractère ordinaire

 >echo "un texte (entre parenthèses) avec aussi des 'apostrophes'."| sed -e "s/.*'\(.*\)'.*/\1/"
apostrophes
# elle capture si on l'échappe

Etonnant non ?


More information about the Shell mailing list