【发布时间】:2022-01-02 18:27:46
【问题描述】:
我有一个简单的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
注意:我在 macOS High Sierra 上使用 grep 版本:grep (BSD grep) 2.5.1-FreeBSD
【问题讨论】:
-
这不是与 GNU grep 的唯一区别。如果您看到更多这样的差异,just install GNU grep 可能比works as expected 更好。
-
我看到了一些与 BSD grep 中的错误有关的问题... 1) unix.stackexchange.com/questions/352977/… 2) unix.stackexchange.com/questions/398223/… 3) unix.stackexchange.com/questions/428340/… .. 解决方法可能是改用 sed/awk
-
包括 awk 在内的 BSD 工具有问题,最好尽量避免。获取 GNU 工具。话虽如此,即使是BSD sed 也应该能够处理
sed 's/^\([^,]*,\).*/\1/' file