为什么这个正则表达式不适用于grep?

Mik*_*lls 3 regex linux grep

我试图从响应中删除"数据包号码624不匹配",所以显而易见的是尝试

cat somefile.txt | grep -v "Packet number \d+ doesn't match"
Run Code Online (Sandbox Code Playgroud)

如果我删除了-v,只是为了测试,那么它什么都不返回.所以也许命令行正在使用\d+首先执行某些操作.所以我尝试了各种组合,比如\\d+ \\d\+ \\\\d+ \\\\d\+ [0-9]+ [0-9]\+.答对了!!最后一个有效.有人能解释一下这里发生了什么吗?如果这被命令行修改,为什么echo "\d+"还会返回\d+

hwn*_*wnd 5

默认情况下,grep使用基本正则表达式\dis(PCRE)语法.它不受支持,因此您需要使用([0-9])或([[:digit:]])代替,或者使用grep with option-P

为什么不起作用[0-9]+

  • BRE中,元字符+失去了意义,需要被转义.

您可以使用以下方法之一解决此问题:

grep -v "Packet number [0-9]\+ doesn't match"
Run Code Online (Sandbox Code Playgroud)

要么

grep -v "Packet number [[:digit:]]\+ doesn't match"
Run Code Online (Sandbox Code Playgroud)