2015-12-01 3 views
1

Почему мой AWK сценарияAWK регулярное выражение и пространство внутри

BEGIN { 
    FS = "][ \t\v]+" 
} 

# Note space after + in the end of the regex. 
NF == 2 && $1 ~ /[:alpha:][:digit:]+/{ 
    print $1, "<<<"; 
} 

Не соответствует любой строке в файле, как следующее:

I1130 15:18:42.526808 17329 thrift_bridge.cpp:126] AAA 
E1130 15:18:42.527042 16076 thrift_bridge.hpp:288] BBB 

Но если я удалю пространство, обе линии находятся в вывод.

+0

Трудно сказать по сценарию, который не делает то, что вы хотите, что вам нужно. Пожалуйста, отредактируйте свой вопрос, чтобы указать, что ваш 'FS' должен соответствовать, и что регулярное выражение в вашем состоянии должно совпадать, –

ответ

5

Это потому, что ваш синтаксис класса символов неправильно:

/[[:alpha:]][[:digit:]]+/

Без квадратных скобок [:alpha:] и [:digit:] не рассматриваются как заранее определенные классы символов POSIX, но как базовые классы.

/[:alpha:][:digit:]+/ - это то же самое, что и /[ahlp:][dgit:]+/, и соответствует p: на каждой строке.

Как @ John1024 заметил, Мок не поддерживает классы POSIX символов, так что вы должны написать:

/[a-zA-Z][0-9]+/

или использовать Gawk, так как он доступен под Linux.

+0

Похоже, он просто не понимает классы char. Вариант, который вы предположили, я попробовал, и он не работает. mawk, Ubuntu 14. – demi

+2

Я просто попробовал его с версией 'mawk' версии 1.3.3 на Debian, и я могу подтвердить, что' mawk' не понимает классы символов. В отличие от этого, в GNU awk классы работают хорошо. – John1024

Смежные вопросы