为什么 BSD 和 GNU grep 在这里给出不同的结果?

为什么 BSD 和 GNU grep 在这里给出不同的结果?

我分发了公共 CSV 文件的稍微修改版本。为了生成修改后的 CSV 文件,我使用了一个简短的单行 grep 命令:

grep -Ev '^([A-Za-zA-Za-z]|[0-90-9]*),' input.csv

实际项目是这里

一个用户报道即使区域设置正确,Mac 上的 BSD grep 也会得到与 GNU grep 不同的结果。我不清楚为什么会发生这种情况,而且我没有 Mac 或 BSD 系统可供测试。 (有没有办法在Linux上安装BSD grep?我没有找到任何快速搜索的东西......)

给定相同的区域设置,为什么上述命令会返回不同的结果?很抱歉没有提供原始 CSV 文件,但它有 200MB 以上;你可以下载它这里如果你愿意的话,它是lex.csvv2.3.0 版本的。


为了更详细地介绍数据,CSV 文件是日语单词列表。第一个字段是文字单词,从不加引号。此处正则表达式的目标是删除以下任一条目:

  1. 拉丁字母表中的一个字母[A-Za-zA-Za-z]
  2. 任意长度的纯数字[0-90-9]*

Unicode 字符是全角拉丁语由于遗留原因在日本使用的字符。

以下是一些随机选取的示例数据:

Fishstat,16201,17684,438,名詞,普通名詞,一般,*,*,*,エフアイエスエイチエスティーエーティー,FISHSTAT,Fishstat,エフアイエスエイチエスティーエーティー,Fishstat,エフアイエスエイチエスティーエーティー,記号,*,*,*,*,*,*,体,エフアイエスエイチエスティーエーテ
ィー,エフアイエスエイチエスティーエーティー,エフアイエスエイチエスティーエーティー,エフアイエスエイチエスティーエーティー,16,C1,*,25110105422963200,91350
FINA,14662,15435,406,名詞,固有名詞,一般,*,*,*,エフアイエヌエー,FINA,FINA,エフアイエヌエー,FINA,エフアイエヌエー,固,*,*,*,*,*,*,固有名,エフアイエヌエー,エフアイエヌエー,エフアイエヌエー,エフアイエヌエー,7,*,*,57503092366778880,209195
FINA,14662,15435,406,名詞,固有名詞,一般,*,*,*,エフアイエヌエー,FINA,FINA,エフアイエヌエー,FINA,エフアイエヌエー,固,*,*,*,*,*,*,固有名,エフアイエヌエー,エフアイエヌエー,エフアイエヌエー,エフアイエヌエー,7,*,*,57503092366778880,209195
FIA,16210,17693,438,名詞,普通名詞,一般,*,*,*,エフアイエー,FIA,FIA,エフアイエー,FIA,エフアイエー,記号,*,*,*,*,*,*,体,エフアイエー,エフアイエー,エフアイエー,エフアイエー,5,C2,*,1099520251404800,4000
FIA,16210,17693,438,名詞,普通名詞,一般,*,*,*,エフアイエー,FIA,FIA,エフアイエー,FIA,エフアイエー,記号,*,*,*,*,*,*,体,エフアイエー,エフアイエー,エフアイエー,エフアイエー,5,C2,*,1099520251404800,4000
エフ・アイ・シー,14659,15432,-1018,名詞,固有名詞,一般,*,*,*,エフアイシー,FIC-FIC,エフ・アイ・シー,エフアイシー,エフ・アイ・シー,エフアイシー,固,*,*,*,*,*,*,固有名,エフアイシー,エフアイシー,エフアイシー,エフアイシー,5,*,*,52112736611607040,189585
FIC,14659,15432,406,名詞,固有名詞,一般,*,*,*,エフアイシー,FIC-FIC,FIC,エフアイシー,FIC,エフアイシー,固,*,*,*,*,*,*,固有名,エフアイシー,エフアイシー,エフアイシー,エフアイシー,5,*,*,52112736645161472,189585
FIC,14659,15432,406,名詞,固有名詞,一般,*,*,*,エフアイシー,FIC-FIC,FIC,エフアイシー,FIC,エフアイシー,固,*,*,*,*,*,*,固有名,エフアイシー,エフアイシー,エフアイシー,エフアイシー,5,*,*,52112736645161472,189585
FIZ,16209,17692,438,名詞,普通名詞,一般,*,*,*,エフアイゼット,FIZ,FIZ,エフアイゼット,FIZ,エフアイゼット,記号,*,*,*,*,*,*,体,エフアイゼット,エフアイゼット,エフアイゼット,エフアイゼット,5,C1,*,25108181277614592,91343
FIZ,16209,17692,438,名詞,普通名詞,一般,*,*,*,エフアイゼット,FIZ,FIZ,エフアイゼット,FIZ,エフアイゼット,記号,*,*,*,*,*,*,体,エフアイゼット,エフアイゼット,エフアイゼット,エフアイゼット,5,C1,*,25108181277614592,91343
FIT,16209,17692,438,名詞,普通名詞,一般,*,*,*,エフアイティー,FIT,FIT,エフアイティー,FIT,エフアイティー,記号,*,*,*,*,*,*,体,エフアイティー,エフアイティー,エフアイティー,エフアイティー,5,C1,*,25107906399707648,91342
FIT,16209,17692,438,名詞,普通名詞,一般,*,*,*,エフアイティー,FIT,FIT,エフアイティー,FIT,エフアイティー,記号,*,*,*,*,*,*,体,エフアイティー,エフアイティー,エフアイティー,エフアイティー,5,C1,*,25107906399707648,91342

根据用户报告,BSD grep 正则表达式排除的条目数量比 GNU grep 多(大约 8000 比 232)。不幸的是,他们没有报告确切的差异,所以我不确定什么样的条目会被区别对待。


我联系了报告此问题的用户,他们提供了要点BSD grep 匹配的条目的数量。它们表明使用此命令找到了条目(我猜-v未使用该命令):

grep -Ev '^([A-Za-zA-Za-z]|[0-90-9]*),' lex.csv

快速浏览一下,它似乎有标点符号和颜文字(如(´・ω・`))。目前还不清楚为什么这些会被包含在我的范围内。它还包括多字符字母条目,这似乎是错误的......

相关内容