J'essaie d'utiliser l'expression régulière suivante dans un script sed
mais cela ne fonctionne pas:
sed -n '/\(www\.\)\?teste/p'
Le regex ci-dessus ne semble pas fonctionner. sed
ne semble pas appliquer le ?
au groupe www\.
.
Cela fonctionne si vous utilisez le -E
paramètre qui commute sed
pour utiliser le regex étendu, donc la syntaxe devient:
sed -En '/(www\.)?teste/p'
Cela fonctionne bien, mais je veux exécuter ce script sur une machine qui ne prend pas en charge le -E
opérateur. Je suis presque sûr que c'est possible et je fais quelque chose de très stupide.
Standard sed
ne comprend que POSIX Expressions régulières de base (BRE), pas les expressions régulières étendues (ERE) et ?
est un métacaractère dans les ERE, mais pas dans les BRE.
Votre version de sed
peut prendre en charge les ERE si vous les activez. Avec GNU sed
, les options pertinentes sont -r
et --regexp-extended
, décrit comme "utiliser des expressions régulières étendues dans le script".
Cependant, si votre sed
ne le supporte pas - tout à fait plausible - alors vous êtes coincé. Soit importez une version de sed
qui les prend en charge, soit remodelez votre traitement. Vous devriez peut-être utiliser awk
à la place.
Je ne sais pas pourquoi je n'ai pas mentionné cela même si sed
ne supporte pas le raccourci ?
ou \?
notation, il prend en charge les plages comptées avec \{n,m\}
, pour simuler ?
avec \{0,1\}
:
sed -n '/\(www\.\)\{0,1\}teste/p' << EOF
http://www.tested.com/
http://tested.com/
http://www.teased.com/
EOF
qui produit:
http://www.tested.com/
http://tested.com/
Testé sur Mac OS X 10.9.1 Mavericks avec le standard BSD sed
et avec GNU sed
4.2.2.