expressions sed

Marc Chantreux marc.chantreux at ulpmm.u-strasbg.fr
Mon Jan 21 20:28:05 CET 2008


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


More information about the Shell mailing list