странное поведение grep с однобуквенными словами

Я удаляю стоп-слова из текста, грубо используя это код

У меня есть следующее

$ cat file
file
types
extensions

$ cat stopwords
i
file
types

grep -vwFf stopwords file

Я ожидаю результата: extensions

, но я получаю (думаю, неправильно)

file
extensions

Это как если бы слово file было пропущено в файле стоп-слов. Теперь вот крутой бит: если я изменю файл стоп-слов, изменив одно слово /букву i в первой строке, на любой другой ascii, кроме f, i, l, e, то тот же grep команда дает мне другой и правильный результат extensions.

Что происходит здесь и как его исправить?

Я использую grep (BSD grep) 2.5.1-FreeBSD на Mac OSX GNU bash, версия 4.4.12 (1)

10 голосов | спросил Tim 15 +03002017-10-15T14:33:34+03:00312017bEurope/MoscowSun, 15 Oct 2017 14:33:34 +0300 2017, 14:33:34

2 ответа


11

Это была ошибка в bsdgrep, относящаяся к переменной, которая отслеживает часть текущей строки, все еще проверяемую, которая перезаписывается с помощью последовательные вызовы для механизма согласования регулярных выражений, когда задействованы несколько шаблонов.

локальное исправление

Вы можете обойти это, не используя опцию -w, которая полагается на эту переменную для правильной работы и, следовательно, но вместо этого используйте регулярные выражения, которые соответствуют началу и концу слов, делая ваш файл stopwords похожим на:

\ & л; я \ >
\ & Л; файл \ >
\ & Л; типы \ >

Это обходное решение также потребует, чтобы вы не использовали параметр -F.

Обратите внимание, что компоненты регулярного выражения documented [[:<:]] и [[:>:]], чтобы в руководстве re_format говорилось о работе not Вот. Это связано с тем, что библиотека регулярных выражений, которая скомпилирована в bsdgrep, включена поддержка совместимости регулярных выражений GNU. Это еще одна ошибка, которая, как сообщается, исправлена.

исправление службы

Эта ошибка была исправлена ​​в начале этого года. Исправление еще не попало в STABLE или RELEASE, а во FreeBSD, но, как сообщается, в CURRENT.

Для получения этой версии в MacOS версии grep, которая получена из кода FreeBSD bsdgrep, обратитесь к Apple. ☺

Дальнейшее чтение

ответил JdeBP 15 +03002017-10-15T18:52:14+03:00312017bEurope/MoscowSun, 15 Oct 2017 18:52:14 +0300 2017, 18:52:14
2

Этот код:

pl " Input data file data1 and stopwords file data2:"
head data1 data2

pl " Expected output:"
cat $E

pl " Results, grep:"
# grep -vwFf stopwords file
grep -vwFf data2 data1

pl " Results, cgrep:"
cgrep -x1 -vFf data2 data1

дает:

-----
 Input data file data1 and stopwords file data2:
==> data1 <==
file
types
extensions

==> data2 <==
i
file
types

-----
 Expected output:
extensions

-----
 Results, grep:
file
extensions

-----
 Results, cgrep:
extensions

В системе вроде:

OS, ker|rel, machine: Apple/BSD, Darwin 16.7.0, x86_64
Distribution        : macOS 10.12.6 (16G29), Sierra
bash GNU bash 3.2.57

Подробнее о cgrep, доступном через варево, и от sourceforge:

cgrep   shows context of matching patterns found in files (man)
Path    : ~/executable/cgrep
Version : 8.15
Type    : Mach-O64-bitexecutablex86_64 ...)
Home    : http://sourceforge.net/projects/cgrep/ (doc)

приветствия, drl

ответил drl 16 +03002017-10-16T05:23:53+03:00312017bEurope/MoscowMon, 16 Oct 2017 05:23:53 +0300 2017, 05:23:53

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132