我有一个csv文件,其中包含以下值:
0.00145423,3.03795e-05
我想检查所有的行是否一致,所以我试图grep任何意外的字符,如此......
grep '[^0-9,e\-\.]' myfile
在我看来,它是这样的:找到包含[]
数字^
,逗号0-9
,字母e {{1}的任何字符,
的行,连字符e
(尝试使用\-
进行转义)或句点\
。但是,连字符仍然匹配。
[ EDIT ]这在python中不会发生,只能使用bash / grep:
\.
不满意的解决方案:
如果我将转义的连字符移动到最后它可以工作:
>>> re.search("[^0-9,e\-\.]", "0.00145423,3.03795e-05")
>>>
将转义的连字符放在grep '[^0-9,e\.\-]' myfile
范围旁边会产生0-9
。
有人可以解释发生了什么吗?这是一些解析问题或某些特定于grep的bash参数吗?
grep: Invalid range end
,bash4.3.33
答案 0 :(得分:6)
在字符列表中包含文字-
的方法是将其放在括号表达式的第一个或最后一个位置,完全如答案所示:Get final special character with a regular expression。
来自POSIX 9.3.5 RE支架表达式:The <hyphen> character shall be treated as itself if it occurs first (after an initial '^', if any) or last in the list, or as an ending range point in a range expression.
某些工具可能有其他方法可以通过某种转义来实现,但您只需将它放在第一位或最后一位就可以安全使用。请注意,-
不是唯一具有不同行为的字符,具体取决于它在括号表达式中显示的位置。请考虑]
和^
。
答案 1 :(得分:2)
请注意-
是一个范围运算符,因此\-\
匹配\
到\
范围内的任何字符,这恰好是\
。
如果你把它移到最后,它会把它的含义作为一个范围,这就是它起作用的原因。