Я удаляю стоп-слова из текста, примерно используя этот код
У меня есть следующее
$ 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 на bash Mac OSX GNU, версия 4.4.12 (1)
-x
переключатель для регулярного выражения строки вместо-w
слова? Тем не менее, я думаю, что-F
переключатель отменит либо один из них, либо наоборот.i
шаблона вместо второго шаблона вstopwords
файле также изменяет поведение.grep
или с GNUgrep
3.1.Ответы:
Это было ошибкой
bsdgrep
, связанной с переменной, которая отслеживает часть текущей строки, все еще сканируемой, которая перезаписывается последовательными вызовами механизма сопоставления регулярных выражений, когда задействованы несколько шаблонов.местное исправление
Вы можете обойти это в некоторой степени, не используя
-w
опцию, которая полагается на эту переменную для правильной работы и, следовательно, терпит неудачу, а вместо этого используя расширения регулярных выражений, которые соответствуют началу и концу слов, делая вашstopwords
файл похожим на:Этот обходной путь также потребует, чтобы вы не использовали эту
-F
опцию.Обратите внимание, что документированные компоненты регулярных выражений
[[:<:]]
и[[:>:]]
о которыхre_format
вам расскажет руководство, работать здесь не будут . Это связано с тем, что в библиотеке регулярных выражений, в которую встроена библиотекаbsdgrep
GNU, включена поддержка совместимости регулярных выражений GNU. Это еще одна ошибка, которая, как сообщается, исправлена.исправление
Эта ошибка была исправлена ранее в этом году. Исправление еще не вошло в STABLE или RELEASE версий FreeBSD, но, по сообщениям, находится в CURRENT.
Чтобы получить это в версии для MacOS
grep
, которая является производной от FreeBSDbsdgrep
, пожалуйста, обратитесь в Apple. ☺дальнейшее чтение
источник
Этот код:
производит:
В такой системе, как:
Более подробная информация о cgrep, доступна через brew и sourceforge:
ура, дрл
источник