Bug 23450

Summary: Поддержка \w и других расширений в регэкспах
Product: Sisyphus Reporter: redbaron <redbaron>
Component: gawkAssignee: placeholder <placeholder>
Status: CLOSED NOTABUG QA Contact: qa-sisyphus
Severity: normal    
Priority: P3 CC: evg, glebfm, ldv, placeholder, vsu
Version: unstable   
Hardware: all   
OS: Linux   

Description redbaron 2010-05-07 17:44:08 MSD

    
Comment 1 redbaron 2010-05-07 17:45:05 MSD
Вот тут http://www.gnu.org/software/gawk/manual/gawk.html#GNU-Regexp-Operators сказано что \w должно работать, а у нас не работает:


gawk: ./analyze.awk:3: warning: escape sequence `\w' treated as plain `w'
Comment 2 redbaron 2010-05-07 18:55:20 MSD
Не работает в частности при присвоении переменной RS.

работает (разделяет записи и выводит всё начиная со второй):
$ echo -e "aaa\n--\nbbbb" | gawk 'BEGIN {RS="\n[^[:alnum:]]+\n"}; NR>1'

не работает (не разделяет записи, соответственно весь ввод одна большая запись):
$ echo -e "aaa\n--\nbbbb" | gawk 'BEGIN {RS=/\n[^\w]+\n/}; NR>1'
Comment 3 Sergey Vlasov 2010-05-08 17:20:17 MSD
На самом деле \w работает, если им правильно пользоваться:

1) Присваивание вида RS=/...regexp.../ не работает:

http://www.gnu.org/software/gawk/manual/gawk.html#Using-Constant-Regexps

Нужно использовать строковую константу: RS="...regexp..."

2) В строковой константе нужно дублировать '\', поскольку они там интерпретируются дважды - при разборе строковой константы и при анализе regexp. Для "\n" это не обязательно, поскольку символ новой строки, попавший в regexp, обрабатывается так же, как и последовательность '\n', а вот "\w" в строковой константе вызывает предупреждение, и до regexp доходит только в виде "w".

3) Запись [^\w] в regexp не работает - \w в этой реализации нельзя включать в набор символов [...], можно использовать только как самостоятельный элемент regexp.

Исправленный и работающий вариант теста:

$ echo -e "aaa\n--\nbbbb" | gawk 'BEGIN {RS="\\n\\W+\\n"}; NR>1'

либо вариант с экономией '\':

echo -e "aaa\n--\nbbbb" | gawk 'BEGIN {RS="\n\\W+\n"}; NR>1'
Comment 4 Dmitry V. Levin 2010-06-04 03:25:32 MSD
Сергей, спасибо.