sed, detection d'une chaine |
Bienvenue invité ( Connexion | Inscription )
sed, detection d'une chaine |
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€" 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...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]) 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 -------------------- |
|
|
Guest_JacqR_* |
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])
|
|
|
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 -------------------- |
|
|
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
|
|
|
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
|
|
|
Nous sommes le : 24th April 2024 - 13:01 |