我有一个充满如下值的 csv 文件:
0.00145423,3.03795e-05
我想检查所有行是否一致,所以我尝试 grep 查找任何意外字符,例如...
grep '[^0-9,e\-\.]' myfile
在我看来,它是这样的:找到一行 []
不是 ^
数字 0-9
的行,逗号 ,
,字母 e e
,连字符 \-
(试图用 \
转义) 或句点 \.
。但是,连字符仍会继续匹配。
[编辑]这不会发生在 python 中,只有 bash/grep 才会发生:
>>> re.search("[^0-9,e\-\.]", "0.00145423,3.03795e-05")
>>>
不令人满意的解决方案:
如果我将转义的连字符移到末尾,它会起作用:
grep '[^0-9,e\.\-]' myfile
将转义连字符放在 0-9
范围的旁边会导致 grep: Invalid range end
。
谁能解释一下这是怎么回事?这是一些 bash 参数解析问题还是 grep 特有的问题?
bash4.3.33
, grep2.21
最佳答案
在字符列表中包含文字 -
的方法是将其放在方括号表达式的第一个或最后一个位置,如答案所示:Get final special character with a regular expression .
来自 POSIX 9.3.5 RE 括号表达式:
The 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.
某些工具可能有其他方法可以通过某种转义来完成此操作,但将它放在最前面或最后总是安全的。
请注意,-
并不是唯一具有不同行为的字符,具体取决于它在括号表达式中的显示位置。考虑 ]
和 ^
。
关于regex - 如何在 POSIX 正则表达式中将连字符转义为字符范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28495913/