如何在POSIX正则表达式中将连字符作为字符范围转义

时间:2015-02-13 09:06:35

标签: regex bash grep

我有一个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 endbash4.3.33

2 个答案:

答案 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)

请注意-是一个范围运算符,因此\-\匹配\\范围内的任何字符,这恰好是\

如果你把它移到最后,它会把它的含义作为一个范围,这就是它起作用的原因。