IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> [script shell] expression régulière qui ne marche pas, et qui pourtant devrait
Options
Papalou
posté 28 Nov 2015, 18:44
Message #1


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 727
Inscrit : 8 Aug 2007
Membre no 92 144



Bonjour à tous,


Je bute sur un truc incompréhensible dans un petit script shell que j'ai écrit.
Il sert à reformater des fichiers textes avec Sed, tout fonctionne parfaitement, mais à la toute fin je dois supprimer les lignes qui contiennent 1, 2, 3 ou 4 chiffres suivis d'un point. Ces lignes ne contiennent que cela, sans aucun espace ni tabulation, et aucune autre ligne ne contient ce genre de pattern, il devrait donc suffire pour matcher à tous les coups :

Code
sed '/[0-9][0-9]?[0-9]?[0-9]?\./d'


Lorsque je teste avec cet outil :

http://www.annuaire-info.com/outil-referen...sion-reguliere/

Ca fonctionne toujours.

Mais dans mon script, non. huh.gif Quelqu'un aurait une idée ? Je fais tourner ce script avec Bash 3.2.48(1)-release, livré d'origine avec mon 10.7.5.


D'avance merci.


--------------------
Mac Mini 2012
Macbook Air 2013
Mac Pro 1,1
Mac Pro 5,1
HP EliteBook 840 G2
NUC7i3BNH - Core i3-7100U @ 2.4GHz - 16Go RAM - SSD Sata Sandisk 480Go
et tout une tripotée de stations i7 et Xeon.
Go to the top of the page
 
+Quote Post
schlum
posté 28 Nov 2015, 20:14
Message #2


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 449
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



C’est une expression régulière perl, pas unix ; elle fonctionnera avec :

Code
perl -pe 's/[0-9][0-9]?[0-9]?[0-9]?\.//'


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
Papalou
posté 28 Nov 2015, 21:03
Message #3


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 727
Inscrit : 8 Aug 2007
Membre no 92 144



Mais elle devrait fonctionner aussi avec sed, non ?

EDIT : en effet, perl arrive à matcher l'expression régulière que sed ne prend pas, mais du coup ça n'efface pas la ligne entière, comme sed le ferait avec sa interne commande 'd'.
Je vais vois si j'y arrive avec awk, du coup.

Ce message a été modifié par Papalou - 28 Nov 2015, 21:29.


--------------------
Mac Mini 2012
Macbook Air 2013
Mac Pro 1,1
Mac Pro 5,1
HP EliteBook 840 G2
NUC7i3BNH - Core i3-7100U @ 2.4GHz - 16Go RAM - SSD Sata Sandisk 480Go
et tout une tripotée de stations i7 et Xeon.
Go to the top of the page
 
+Quote Post
schlum
posté 28 Nov 2015, 22:25
Message #4


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 449
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Le méta-caractère '?' (qui veut dire 0 ou une occurrence) n’existe pas dans les expressions régulières Unix (ed, vi, ex, sed, awk).

Si je ne m’abuse, ce que tu cherches à faire n’est pas faisable avec les expressions régulières Unix qui n’ont pas non plus d’opérateur « ou ».

Par contre, il existe de multiples manières de le faire avec les expressions perl ; de la plus longue à la plus courte :

^(?:[0-9]|[0-9][0-9]|[0-9][0-9][0-9]|[0-9][0-9])\.$
^[0-9][0-9]?[0-9]?[0-9]?\.$
^[0-9](?:[0-9]?){3}\.$
^[0-9][0-9]{,3}\.$
^[0-9]{1,4}\.$


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
Papalou
posté 29 Nov 2015, 00:02
Message #5


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 727
Inscrit : 8 Aug 2007
Membre no 92 144



Je viens de vérifier, ça matche aussi avec awk. Merci pour ton aide, problème résolu, j'ai même le choix entre perl et awk ! cool.gif

Ce message a été modifié par Papalou - 29 Nov 2015, 00:03.


--------------------
Mac Mini 2012
Macbook Air 2013
Mac Pro 1,1
Mac Pro 5,1
HP EliteBook 840 G2
NUC7i3BNH - Core i3-7100U @ 2.4GHz - 16Go RAM - SSD Sata Sandisk 480Go
et tout une tripotée de stations i7 et Xeon.
Go to the top of the page
 
+Quote Post
schlum
posté 29 Nov 2015, 00:12
Message #6


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 449
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Effectivement, awk semble implémenter les « extended regular expressions » qui sont grosso modo compatibles avec les expressions régulières perl.

Apparemment 'sed' aussi en fait, avec l’option -E

Code
     -E      Interpret regular expressions as extended (modern) regular expressions rather than basic regular expressions (BRE's).  The re_format(7) manual page fully describes both formats.


Code
schlum$ echo "a\n1.\n23.\n4" | sed -E '/[0-9]{1,4}\./d'
a
4
00:08:12 [~] schlum$


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
Papalou
posté 30 Nov 2015, 14:58
Message #7


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 727
Inscrit : 8 Aug 2007
Membre no 92 144



J'ai tendance à me méfier de sed -e, peut-être à tort, pour des raisons de portabilité.

Je pensais vraiment que le '?' faisait partie du jeu des expressions standards, merci encore de m'avoir remis les pendules à l'heure sur ce point en tout cas.

Ce message a été modifié par Papalou - 30 Nov 2015, 15:01.


--------------------
Mac Mini 2012
Macbook Air 2013
Mac Pro 1,1
Mac Pro 5,1
HP EliteBook 840 G2
NUC7i3BNH - Core i3-7100U @ 2.4GHz - 16Go RAM - SSD Sata Sandisk 480Go
et tout une tripotée de stations i7 et Xeon.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 24th April 2024 - 09:10