#1 Le 10/04/2014, à 10:43
- claudius01
[Résolu] [gawk + regex] Comportement différent de [A-Z] et [[:upper:]]
Bonjour,
Je soumets à votre sagacité ce comportement différent.
Le fichier de données à traiter :
$ cat regex.txt
012abcABC
012aAbBcC
Le script qui réalise une extraction à partir de la 1ère lettre majuscule :
$ cat regex.sh
echo "Extract with the regex '[:upper:]'"
gawk '{n = match($0, /[[:upper:]]/); printf("\"%s\" => n = %s extract = \"%s\"\n", $0, n, substr($0, n));}' regex.txt
echo
echo "Extract with the regex 'A-Z'"
gawk '{n = match($0, /[A-Z]/); printf("\"%s\" => n = %s extract = \"%s\"\n", $0, n, substr($0, n));}' regex.txt
Le résultat des 2 comportements :
$ ./regex.sh
Extract with the regex '[:upper:]'
"012abcABC" => n = 7 extract = "ABC"
"012aAbBcC" => n = 5 extract = "AbBcC"
Extract with the regex 'A-Z'
"012abcABC" => n = 5 extract = "bcABC" <= Mauvaise extraction ;-(
"012aAbBcC" => n = 5 extract = "AbBcC"
Version de gawk : GNU Awk 3.1.8 / Ubuntu 12.04 LTS
Cordialement, A+
--
Claudius
Dernière modification par claudius01 (Le 10/04/2014, à 12:16)
Hors ligne
#2 Le 10/04/2014, à 11:04
- credenhill
Re : [Résolu] [gawk + regex] Comportement différent de [A-Z] et [[:upper:]]
hello
pas de problème
$ ./regex.sh
Extract with the regex '[:upper:]'
"012abcABC" => n = 7 extract = "ABC"
"012aAbBcC" => n = 5 extract = "AbBcC"
Extract with the regex 'A-Z'
"012abcABC" => n = 7 extract = "ABC"
"012aAbBcC" => n = 5 extract = "AbBcC"
$
$ awk --version | head -1
GNU Awk 3.1.6
En ligne
#3 Le 10/04/2014, à 11:07
- pingouinux
Re : [Résolu] [gawk + regex] Comportement différent de [A-Z] et [[:upper:]]
Bonjour,
C'est un problème de "collating sequence". Pour avoir le bon comportement dans les deux cas :
LC_COLLATE="C" ./regex.sh
Ajouté : Tu peux aussi faire ceci
grep -o '[A-Z].*' regex.txt
Dernière modification par pingouinux (Le 10/04/2014, à 11:14)
Hors ligne
#4 Le 10/04/2014, à 12:14
- claudius01
Re : [Résolu] [gawk + regex] Comportement différent de [A-Z] et [[:upper:]]
Merci à tous les 2,
Effectivement 'LC_COLLATE="C" ./regex.sh' réalise correctement l'extraction.
En //, j'ai cherché et trouvé cela : Regexp Ranges and Locales: A Long Sad Story qui explique le pourquoi du comment.
Merci encore, A+
--
Claudius
Hors ligne