Grep正则表达式无法按预期工作

时间:2018-07-09 07:31:00

标签: regex grep

我有一个简单的grep命令,试图仅获取CSV文件的第一列(包括逗号)。就像这样...

grep -Eo '^[^,]+,' some.csv

所以在我的脑海中,它的意思是“ 仅让我找到该行的匹配部分,其中每行以至少一个不是逗号的字符开头,然后是单个逗号”。

在文件some.csv上,看起来像这样:

column1,column2,column3,column4
column1,column2,column3,column4
column1,column2,column3,column4

我希望得到这样的输出:

column1,
column1,
column1,

但我得到以下输出:

column1,
column2,
column3,
column1,
column2,
column3,
column1,
column2,
column3,

那是为什么? 我的grep / regex中缺少什么?我的预期输出不正确吗?

如果我删除了正则表达式中尾部逗号的要求,则该命令将按预期运行。

grep -Eo '^[^,]+' some.csv

给我:

column1
column1
column1

注意:我在使用grep版本的MacOS High Sierra:grep (BSD grep) 2.5.1-FreeBSD

1 个答案:

答案 0 :(得分:1)

BSD grep通常是越野车。请参阅以下相关文章:

上面的最后一个链接提到了您的情况:使用-o选项时,grep出于某种原因会忽略^锚点。 FreeBSD bug中也描述了此问题:

  

我注意到相同版本的grep还有更多问题。我不   知道它们是否相关,但是我现在将它们附加在这里。

     

$ printf abc | grep -o '^[a-c]'

     

应该只打印“ a”,而是针对每个字母给出三个匹配   输入的文本。

作为解决方法,最好安装GNU grepworks as expected

或者,将sed与BRE POSIX模式一起使用:

sed -i '' 's/^\([^,]*,\).*/\1/' file

模式匹配的地方

  • ^-一行的开头
  • \([^,]*,\)-第1组(后来由RHS引用为\1后向引用):
    • [^,]*-除,之外的零个或多个字符
    • ,-一个,字符
  • .*-该行的其余部分。

请注意,-i将就地更改文件内容。如果需要,请使用-i.bak创建一个备份文件(然后,您将不需要下一个空的'')。