Cygwin正则表达式速记字符类无法匹配

时间:2013-08-21 04:04:43

标签: regex sed cygwin character-class

我有一个文件

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   

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

更新

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

更新2

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

2 个答案:

答案 0 :(得分:3)

您正在错误地指定字符类 manual会告诉你:

  • 括号表达式是[]
  • 所包含的字符列表
  • 某些命名的字符类是在括号表达式中预定义的:
    • [:digit:]数字:0 1 2 3 4 5 6 7 8 9.

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

你会发现:

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

答案 1 :(得分:0)

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