Grep
grep 單字母單詞的奇怪行為
我正在從文本中刪除停用詞,大致使用此 程式碼
我有以下
$ 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。☺進一步閱讀
- 喬納森·德博因·波拉德 (2017-10-15)。給定多個模式時,bsdgrep 的行為不正確。錯誤 #223031。FreeBSD Bugzilla。
- 凱爾·埃文斯 (2017-04-03)。bsdgrep:修復匹配行為。修訂版 316477。FreeBSD 原始碼。
- 凱爾·埃文斯 (2017-05-02)。bsdgrep:修復 -w -v 與某些模式不正確匹配。修訂版 317665。FreeBSD 原始碼。
- 內森週(2014-06-16)。grep(1) 和 bsdgrep(1) 無法辨識$$ [:<: $$] 和$$ [:>: $$] . 錯誤 #191086。FreeBSD Bugzilla。