salut, On Mon, Jan 21, 2008 at 06:59:39PM +0100, Daniel Caillibaud wrote:
J'ai toujours un peu de mal avec les regexp à la sauce sed (pourquoi il faut échapper le quantificateur + et pas * par exemple)...
sans avoir cherché: je pense que les raisons sont historiques: cette incoherence doit être héritée des tous premiers moteurs.
1) peut-on rendre un quantificateur (* ou +) non gourmand ? (il me semble que la réponse est non, que ce soit pour le pattern de recherche de ligne ou pour la substitution, mais je ne l'ai pas trouvé explicitement)
tant que je sache: la réponse est non.
2) pourquoi pour indiquer "tout caractère sauf un ]" il faut mettre [^]] et pas [^\]] ?
parceque dans les metacaractères, c'est la place du crochet qui determine le fait qu'on parle bien du symbole lui-même.
echo '[aze]aAbAc' | sed 's/[^][]//g' []
3) Plus généralement, si une bonne âme veut bien ajouter à la page http://cli.asyd.net/home/filtres/sed la liste de ce qui doit être échappé ou pas suivant les cas...
et par là réécrire man regex ? je ne crois pas que ce soit utile.
A première vue : - dans les séquences entre crochets, il ne faut echapper que . et -, et le \- (apparemment s'il est en 1er pas besoin d'échapper)
idem que pour le crochet: c'est la position (1er ou dernier) qui rend au symbole son simple rang. De manière générale, je crois qu'il ne faut pas tenter de retenir les règles mais tenter de les déduire: [a-z] < - a un sens [az-] < - n'a pas de sens [-az] < - n'a pas de sens
- partout, \n et \t conservent leur sens habituel (interprêté par sed, pas par le shell car on place en général les expression sed entre quotes simple, pour éviter justement des effets de bords liés aux interprêtations du shell).
et \v, et autres ...
s="bla bla [[http://domaine.tld/url]]-[[http://domaine2.tld/url2Plus?com=pliqu&E9e]] blabla"
echo $s | sed -e 's#[]]*#_#g' _b_l_a_ _b_l_a_ _[_[_h_t_t_p_:_/_/_d_o_m_a_i_n_e_._t_l_d_/_u_r_l_-_[_[_h_t_t_p_:_/_/_d_o_m_a_i_n_e_2_._t_l_d_/_u_r_l_2_P_l_u_s_?_c_o_m_=_p_l_i_q_u_&_E_9_e_ _b_l_a_b_l_a_ => curieux non ?
non! A* signifie : de 0 a n fois le motif A. 0 donc chaine vide matche aussi. Il y a une chaine vide entre chaque caracteres. marc