2009-02-20 8 views
0

Je suis sous Ubuntu 8.04 et mon code ressemble à ceci ...AWK - Mon expression rationnelle ne respecterait pas le cas

for (i=1;i<=n;i++) 
{ 
    if (arr[i] ~ /^[A-Z]{2,4}$/) printf(arr[i]) 
} 

je découvre rapidement que la {n} expression ne fonctionnera pas dans gawk sans le commutateur --posix. Une fois activée, l'expression fonctionne mais elle est insensible à la casse AAAA et aaaa. Qu'est-ce qui se passe ici?

+0

Montrez-nous l'intégralité du script ou de la commande AWK. Je pense que je sais ce qui se passe, mais vous n'avez pas fourni suffisamment d'informations pour être sûr. – paxdiablo

Répondre

0

J'ai seulement mawk installé, mais c'est peut-être ce que vous cherchez?

for (i = 1; i < = n; i ++) { if (arr [i] ~ [^ AZ] {2,4} $ /) printf (arr [i])}

+0

Désolé, mais je ne pense pas que c'est ce que l'OP a demandé – jpalecek

5

L'expression elle-même fonctionne pour moi:

dfs:~# gawk --posix '/^[A-Z]{2,4}$/ {print "Yes"}' 
AAAA 
Yes 
AA 
Yes 
TT 
Yes 
tt 
YY 
Yes 
yy 

Vos problèmes peuvent être causés par deux choses. Soit vous avez accidentellement mis la variable IGNORECASE awk ou sinon case insensitive operation (BTW IGNORECASE ne fonctionne pas avec --posix, mais avec --re-interval, qui active aussi les accolades dans les expressions régulières), ou c'est un problème classique de la séquence d'assemblage des paramètres régionaux (parce que gawk effectue une comparaison de caractères en fonction des paramètres régionaux), ce qui signifie que les caractères en minuscules se comparent entre certains caractères majuscules. Citation du relevant part of the manual:

De nombreux endroits trier caractères dans ordre de dictionnaire, et dans ces lieux , « [a-dx-z] » est généralement pas équivalent à « [abcdxyz] »; à la place, pourrait être équivalent à '[aBbCcDdxXyYz]', par exemple. Pour obtenir l'interprétation traditionnelle d'expressions de parenthèse, vous pouvez utiliser l'environnement local C en définissant la variable d'environnement LC_ALL à la valeur 'C'.

+0

Peut-être que vous devriez spécifier que IGNORECASE est une variable d'environnement pour plus de clarté. – dmckee

+0

Oui, je devrais probablement avoir, parce que ce n'est en fait pas une variable d'environnement. Edité pour clarifier cela. – jpalecek

0

Sinon, si vous utilisez GNU awk, vous pouvez utiliser le [: upper:] classe caractère alphabétique.

% awk '{print /[:upper:]/?"OK":"KO"}' 
AA 
KO 
aa 
KO 
Questions connexes