Grep

grep 單字母單詞的奇怪行為

  • April 28, 2018

我正在從文本中刪除停用詞,大致使用此 程式碼

我有以下

$ cat file
file
types
extensions

$ cat stopwords
i
file
types

grep -vwFf stopwords file

我期待結果: extensions

但我得到了(我認為不正確)

file
extensions

就好像該詞file已在停用詞文件中被跳過。現在這是很酷的一點:如果我修改停用詞文件,通過將i第一行上的單個單詞/字母更改為除f, i, l,之外的任何其他 ascii 字母e,那麼相同的 grep 命令會給我一個不同且正確的結果extensions

這是怎麼回事,我該如何解決?

我在 Mac OSX GNU bash 版本 4.4.12(1) 上使用 grep (BSD grep) 2.5.1-FreeBSD

這是 中的一個錯誤bsdgrep,與跟踪目前行中仍要掃描的部分的變數有關,當涉及多個模式時,該變數會被對正則表達式匹配引擎的連續呼叫覆蓋。

本地修復

您可以通過不使用該選項在一定程度上解決此問題,該-w選項依賴此變數進行正確操作因此失敗,而是使用匹配單詞開頭和結尾的正則表達式擴展,使您的stopwords文件看起來像:

\<我\>
\<文件\>
\<類型\>

此解決方法還要求您不要使用該-F選項。

請注意,記錄在案的正則表達式組件[[:<:]]和手冊[[:>:]]告訴re_format您的內容在這裡不起作用。這是因為編譯成的正則表達式庫bsdgrep開啟了 GNU 正則表達式兼容性支持。這是另一個錯誤,據報導已修復。

服務修復

此錯誤已在今年早些時候修復。該修復程序尚未進入 FreeBSD 的 STABLE 或 RELEASE 版本,但據報導已在 CURRENT 中。

要將它加入到 MacOS 版本(grep源自 FreeBSD 的)bsdgrep中,請諮詢 Apple。☺

進一步閱讀

引用自:https://unix.stackexchange.com/questions/398223