我试图找出 CSV 中包含浮点数的第一列中的任何浮点数小数点后是否有 1。以下是我的 CSV 中的示例行:
1082805252197942751,34225793738713276,serialtooldata,1,目标,75512140,125.0,63.0,29.0,1,,,,0,899,,
第七列是我感兴趣的列,在它上面的行中小数点后没有 1 (125.0)
我想出了两个可能的正则表达式:
^[0-9]+,[0-9]+,[a-z0-9]+,[0-9]+,[A-Za-z0-9\ ]+,[0-9]+,[0-9]+\.1
或者
^[A-Za-z0-9\ ,]+\.1
这两个似乎都有效,即在正则表达式测试页面上(如 regex101这里和这里)该行无法正确匹配任一正则表达式。但是当我像这样在终端尝试它们时
egrep ^[0-9]+,[0-9]+,[a-z0-9]+,[0-9]+,[A-Za-z0-9\ ]+,[0-9]+,[0-9]+\.1 tool_data_160321.csv
或者
egrep ^[A-Za-z0-9\ ,]+\.1 tool_data_160321.csv
然后该行将被列为匹配项。为什么egrep
认为该行与任何一个正则表达式匹配,但实际上并不匹配?
答案1
因为你缺少引号。反斜杠由 shell 解释,并且 grep 命令只获取.1
,而不是\.1
,因此它匹配后面跟着 的任何字符1
。
最好引用整个字符串:
egrep '^[A-Za-z0-9\ ,]+\.1' tool_data_160321.csv
或者在本例中引用引号字符:
egrep ^[A-Za-z0-9\ ,]+\\.1 tool_data_160321.csv
请注意,第二个示例仍然可能会导致意外,具体取决于存在的文件,因此只需引用整个字符串,这永远不会错。