2

我有一个文件

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
4

2 回答 2

3

错误地指定了字符类。手册会告诉你:

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

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

你会找到:

$ cat input | grep -o '[[:digit:]]'
2
于 2013-08-21T05:02:03.807 回答
0

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

于 2013-08-21T04:26:43.667 回答