IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> sed, detection d'une chaine
Options
tepaze
posté 28 Jan 2015, 17:03
Message #1


Adepte de Macbidouille
*

Groupe : Membres
Messages : 161
Inscrit : 12 Nov 2003
Membre no 11 595



Bonjour,

Je dois au sein d'une chaine détecter une occurrence en fonction d'un masque de référence.
La chaine doit etre composé du mot "LOT" ou du symbole "#' suivi d'une serie de chiffres au nombre de 1 à 4, suivi d'une lettre optionnel. Enfin une autre serie de chiffre optionnel au format monétique suivi d'un symbole "€", elle aussi optionnel.

Quelques exemples concrets :
Code
#123
LOT123
LOT  123
#123A
LOT   123     A
LOT   123   A    4.000.000    €
#      123   A    €    4.000.000


Si l'un de ces format de chaine est détecter, je dois extraire le N° de LOT avec la lettre si elle existe (123A pour l'exemple)

J'ai du le faire dans un premier temps sous linux ou, avec de l'aide, je suis arrivé à ceci :
Code
res="LOT 123a 4.000€"
res1=$(echo $res | sed -r 's/((#|lot|Lot|LOT|LQT)?(\s|\s+)?([0-9]{1,3})[\s|\s+]?([a-zA-Z]?))((€|EUR|EURO)?(\s|\s+)?([0-9\.]+).*)?/\4\5|\9/;s/\.//g' | tr [a-z] [A-Z])
L'option -r n'existant pas sous Mac (d'après ce que j'ai lu) j'ai remplacé par -E. Mais j'obtiens des résultats totalement incohérent...
J'ai bien conscience que ma ligne n'est pas hyper optimisé, mais il faut bien garder à l'esprit que la chaine d'où je dois extraire le N° de lot doit absolument avoir une composition strict, histoire de ne pas extraire n'importe quel chiffres...

J'ai donc besoin d'aide...

Par avance merci


--------------------
Go to the top of the page
 
+Quote Post
Guest_JacqR_*
posté 28 Jan 2015, 23:25
Message #2





Guests






Bonsoir,

\s ne fonctionne pas dans sed sous OSX

Essaie cette commande:
Code
res1=$(echo "$res" | sed -E 's/^(#|lot|Lot|LOT|LQT)[[:space:]]*([0-9]{1,4})[[:space:]]*([a-zA-Z]?)[[:space:]]*((€|EUR|EURO)?[[:space:]]*([0-9.]+))?.*/\2\3|\6/;s/\.//g' | tr [a-z] [A-Z])
Go to the top of the page
 
+Quote Post
tepaze
posté 29 Jan 2015, 00:19
Message #3


Adepte de Macbidouille
*

Groupe : Membres
Messages : 161
Inscrit : 12 Nov 2003
Membre no 11 595



Ah merci JacqR,

Je cherche depuis pas mal de temps, et je ne comprenais pas le pourquoi du comment. Ta commande fonctionne parfaitement sans les guillements de $res.
Vraiment merci.

Cordialement

Tepaze


--------------------
Go to the top of the page
 
+Quote Post
yponomeute
posté 29 Jan 2015, 09:15
Message #4


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 969
Inscrit : 26 Jan 2011
Lieu : Pollachius virens
Membre no 164 083



Salut,

Je vois que passe le résultat obtenu en lettres majuscules avec tr [a-z] [A-Z]. Si tu fais cette opération avant de passer la chaine de caractères à sed, tu peut simplifier un peu ta regex

Code
res1=$(echo "$res" | tr [a-z] [A-Z] | sed -E 's/^(#|LOT|LQT)[[:space:]]*([0-9]{1,4})[[:space:]]*([A-Z]?)[[:space:]]*((€|EUR|EURO)?[[:space:]]*([0-9.]+))?.*/\2\3|\6/;s/\.//g' )


--------------------
MBP 2017 15" avec clavier pourri et touchbar inutile
Go to the top of the page
 
+Quote Post
noop
posté 29 Jan 2015, 12:05
Message #5


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 964
Inscrit : 3 Nov 2005
Membre no 49 239



awk me semblerait plus apprioré dans ton cas
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 - 13:01