Bug 23450 - Поддержка \w и других расширений в регэкспах
Summary: Поддержка \w и других расширений в регэкспах
Status: CLOSED NOTABUG
Alias: None
Product: Sisyphus
Classification: Development
Component: gawk (show other bugs)
Version: unstable
Hardware: all Linux
: P3 normal
Assignee: placeholder@altlinux.org
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2010-05-07 17:44 MSD by redbaron
Modified: 2010-06-04 03:25 MSD (History)
5 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
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
Сергей, спасибо.