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

标签 regex bash grep

我有一个充满如下值的 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/

相关文章:

bash - 仅使用 netstat 的网络带宽利用率 bash 脚本

bash - grep 部分出现在一个文件中的行到另一个文件

regex - 将一系列日期中的 Grep 作为文件名

grep - 使用 grep 搜索匹配的字符串,但搜索应该只显示没有匹配词的字符串的其余部分

php - 正则表达式包含一个字段

Java 正则表达式 : Word Boundary Matcher in a String Literal

linux - 一步杀死并等待

php - 了解 preg_match_all() 函数调用中的模式

regex - Oracle 18c - REGEXP_REPLACE 的替代方案

regex - sed通配符替换