我有一个简单的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
答案 0 :(得分:1)
BSD grep
通常是越野车。请参阅以下相关文章:
上面的最后一个链接提到了您的情况:使用-o
选项时,grep
出于某种原因会忽略^
锚点。 FreeBSD bug中也描述了此问题:
我注意到相同版本的grep还有更多问题。我不 知道它们是否相关,但是我现在将它们附加在这里。
$ printf abc | grep -o '^[a-c]'
应该只打印“ a”,而是针对每个字母给出三个匹配 输入的文本。
作为解决方法,最好安装GNU grep的works as expected。
或者,将sed
与BRE POSIX模式一起使用:
sed -i '' 's/^\([^,]*,\).*/\1/' file
模式匹配的地方
^
-一行的开头\([^,]*,\)
-第1组(后来由RHS引用为\1
后向引用):
[^,]*
-除,
之外的零个或多个字符,
-一个,
字符.*
-该行的其余部分。请注意,-i
将就地更改文件内容。如果需要,请使用-i.bak
创建一个备份文件(然后,您将不需要下一个空的''
)。