web-dev-qa-db-fra.com

Sed expression n'autorise pas la chaîne groupée facultative

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.

53
Eduardo

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.


2014-02-21

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.

93
Jonathan Leffler