Daniel Caillibaud wrote:
Mon pb est de comprendre quand le \ signifie "échapper le caractère qui suit" et quand il signifie "caractère backslash". Il me semble que là dessus, sed fonctionne différemment des autres outils qui utilisent les regexp (le pb vient sûrement de la différence regex posix et regex PCRE que j'ai davantage l'habitude de manipuler).
echo '[aze]\-]a-Ab\Ac' | sed -e 's#[\]-]#_#g' [aze]_a-Ab\Ac
echo '[aze]\-]a-Ab\Ac' | sed -e 's#[]\-]#_#g' [aze____a_Ab_Ac
echo '[aze]\-]a-Ab\Ac' | sed -e 's#\-]#_#g' [aze]\_a-Ab\Ac
echo '[aze]\-]a-Ab\Ac' | sed -e 's#\\-]#_#g' [aze]_a-Ab\Ac
Apparemment, le \ est toujours pris comme un caractère quand il est entre [], et jamais en dehors, d'où la difficulté quand on cherche du crochet fermant et du tiret (et autre chose), ça me parait pa immédiat de savoir qu'il faut commencer par crochet fermant puis tiret puis le reste.
Re, Vraiment dans tes quatre exemples je ne vois pas ce qu'il y a de compliqué. Dans le premier cas, le premier caractère après le [ est le \, suivit du ], ça correspond bien à "caractère backslash'. Dans le deuxième cas, le premier caractère après le [ est ]. Le ] est donc un caractère pris en compte au même titre que \ et -. C'est donc ] ou - ou \. Dans le cas d'après pas de [, chaque caractère est interprété. En dehors de [], \ est effectivement un caractère d'échappement. Donc \-] signifie - puis ]. Enfin pour le dernier exemple, tu as un backslash et un tiret. Rien de plus simple. Vraiment, je ne suis pas un grand gourou de sed et pour tout dire, je ne l'ai pratiquement jamais utilisé, mais je ne vois vraiment pas comment, dans les exemples que tu as donné, on pourrait arriver à un autre résultat, et donc en quoi ces résultats sont surprenants ou, selon toi, imprévisibles. -- À++ theo.