【问题标题】:Cygwin Regex Shorthand Character Classes Fail to MatchCygwin 正则表达式速记字符类无法匹配
【发布时间】:2013-08-21 04:04:42
【问题描述】:

我有一个文件

cat /tmp/b
A
Quick
Brown
Fox
Killed
2 Hens 

如果我在 [0-9] 上匹配,那么我会得到预期的结果

cat /tmp/b | grep "[0-9]"
2 Hens

但如果我尝试匹配数字字符类,我会得到意想不到的结果

cat /tmp/b | grep "\d"
Killed

无论我尝试什么组合我认为可能有效的东西,这种情况都会继续

cat /tmp/b | grep "\\d"
Killed
cat /tmp/b | grep "\\d"
Killed
cat /tmp/b | grep "\\\\d"
{No matches}
cat /tmp/b | grep "\\\d"
{No matches}
cat /tmp/b | grep "[\\d]"
Killed
cat /tmp/b | grep "[d]"
Killed
cat /tmp/b | grep "[\\\\d]"
Killed   

有谁知道我做错了什么以及如何让 Character Classed 在 cygwin sed 中工作

更新

cat /tmp/b | grep [:digit]
Quick
Killed

更新 2

cat /tmp/b | grep [[:digit:]]
2 Hens

【问题讨论】:

  • 您是否检查过您的 Unix shell 路径中是否有多个 grep?也许您最终调用的那个不支持该语法。如果您在路径中的 Cygwin 目录之前有常规 Windows 目录,那么您的系统上是否安装了 Windows grep?尝试提供您想要的 grep 版本的完整路径。您可能还想仔细检查没有为“grep”定义的 shell 别名。哦,还有,尝试使用单引号。
  • which grep 返回/usr/bin/grep

标签: regex sed cygwin character-class


【解决方案1】:

您指定的字符类不正确manual 会告诉你:

  • 方括号表达式是由[] 括起来的字符列表
  • 某些命名的字符类别是在括号表达式中预定义的:
    • [:digit:] 位数:0 1 2 3 4 5 6 7 8 9。

这意味着要匹配[:digit:],您需要说[[:digit:]]

你会发现:

$ cat input | grep -o '[[:digit:]]'
2

【讨论】:

    【解决方案2】:

    我很确定 cygwin 使用 GNU grep regex,它不支持 \d 缩写,但支持 [:digit:]。顺便说一句,在字符类括号之外的 d 前面有多个反斜杠的情况下,我无法解释为什么要匹配 d

    【讨论】:

    • 我已经着色所以我可以看到它与d匹配
    • 顺便说一句,所有[..] 都与d 匹配并不奇怪,因为\`s are just adding \ ` 与类中的字符集相匹配,但有点令人惊讶的是\d 匹配d。对于它的价值,在 Mac OS 上,虽然 \d 与 d 匹配,但包括 \ 在内的所有引用变体都不匹配。
    • 很抱歉没有假设您理解它与d 匹配。我相应地更新了答案。
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 2012-06-05
    • 2013-12-25
    相关资源
    最近更新 更多