expressions sed

Daniel Caillibaud ml at editionsdidier.com
Mon Jan 21 18:59:39 CET 2008


Bonjour,

J'ai toujours un peu de mal avec les regexp à la sauce sed (pourquoi il faut échapper le quantificateur + et pas * par 
exemple)...

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)

2) pourquoi pour indiquer "tout caractère sauf un ]" il faut mettre [^]] et pas [^\]] ?

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...

Je veux bien essayer, mais ça m'ennuierait d'y écrire des bêtises.

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)
- en dehors des [, echapper le + lui donne sa valeur de quantificateur mais échapper * lui retire sa valeur de 
quantificateur.
- les () sont interprêtées comme caractères et prennent leur caractère capturant quand elles sont échappées (dans le 1er 
terme d'une commande s)
- 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).

Mais il me reste des cas que je m'explique mal, cf les tests suivants (avec bash 2.05b et (gnu) sed 4.1.2)

s="bla bla [[http://domaine.tld/url]]-[[http://domaine2.tld/url2Plus?com=pliqu&E9e]] blabla"

echo $s | sed -e 's#[]]#_#g'
bla bla [[http://domaine.tld/url__-[[http://domaine2.tld/url2Plus?com=pliqu&E9e__ blabla
=> le crochet fermant est bien remplacé

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 ?

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_
=> pas tellement plus bizarre que le précédent

echo $s | sed -e 's#[]]#_#g'
bla bla [[http://domaine.tld/url__-[[http://domaine2.tld/url2Plus?com=pliqu&E9e__ blabla

echo $s | sed -e 's#[]\-]#_#g'
bla bla [[http://domaine.tld/url___[[http://domaine2.tld/url2Plus?com=pliqu&E9e__ blabla

echo $s | sed -e 's#[\-]]#_#g'
bla bla [[http://domaine.tld/url]]-[[http://domaine2.tld/url2Plus?com=pliqu&E9e]] blabla
=> tiens, ça marche plus si on les inverse...

etc...

-- 
Daniel


More information about the Shell mailing list