AWK - мое регулярное выражение не будет соответствовать делу - PullRequest
0 голосов
/ 20 февраля 2009

Я использую Ubuntu 8.04, и мой код выглядит так ...

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

Я быстро обнаружил, что выражение {n} не будет работать в gawk без ключа --posix. После включения выражение работает, но оно не учитывает регистр, сопоставляя AAAA и aaaa. Что здесь происходит?

Ответы [ 3 ]

5 голосов
/ 20 февраля 2009

У меня само выражение работает:

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

Ваши проблемы могут быть вызваны двумя причинами. Либо вы случайно установили переменную IGNORECASE awk, либо иным образом перешли на операцию без учета регистра (КСТАТИ IGNORECASE не работает с --posix, но работает с --re-interval, что обеспечивает регулярное использование скобок выражений тоже), или это классическая проблема упорядочения последовательности локали (потому что gawk выполняет сравнение символов с учетом локали), что означает сравнение строчных букв между некоторыми заглавными буквами. Цитата из соответствующей части руководства:

Многие локали сортируют символы в порядок словаря, и в этих locales, ‘[a-dx-z]’ обычно не эквивалентно ‘[abcdxyz]’; вместо этого может быть эквивалентно «[ABbCcDdxXyYz]», например. к получить традиционную интерпретацию скобочных выражений, вы можете использовать локаль C, установив LC_ALL переменная окружения со значением «C».

0 голосов
/ 19 марта 2009

В противном случае, если вы используете GNU awk , вы можете использовать [: upper:] класс буквенных символов.

% awk '{print /[:upper:]/?"OK":"KO"}'
AA
KO
aa
KO
0 голосов
/ 20 февраля 2009

У меня установлен только mawk, но, может быть, это то, что вы ищете?

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

...