egrep 匹配不应该匹配的行

egrep 匹配不应该匹配的行

我试图找出 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

请注意,第二个示例仍然可能会导致意外,具体取决于存在的文件,因此只需引用整个字符串,这永远不会错。

相关内容