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

时间:2014-06-17 01:38:31

标签: regex linux grep

我正在尝试从响应中删除“数据包号码624不匹配”,因此显而易见的是

cat somefile.txt | grep -v "Packet number \d+ doesn't match"

如果我删除-v,仅用于测试,则它不会返回任何内容。因此,命令行可能首先使用\d+执行某些操作。所以我尝试了各种组合,例如\\d+ \\d\+ \\\\d+ \\\\d\+ [0-9]+ [0-9]\+。答对了!!最后一个有效。有人能解释一下这里发生了什么吗?如果这被命令行修改,为什么echo "\d+"仍会返回\d+

3 个答案:

答案 0 :(得分:5)

默认情况下,grep使用基本正则表达式,而\d使用(PCRE)语法。它不受支持,因此您需要使用([0-9])或([[:digit:]]),或者使用带有-P选项的grep

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

  • BRE中,+之类的元字符会失去意义,需要转义。

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

grep -v "Packet number [0-9]\+ doesn't match"

OR

grep -v "Packet number [[:digit:]]\+ doesn't match"

答案 1 :(得分:1)

-v表示反向,将列出任何不匹配模式的行 -E是正确的参数 的 [修正] -E是正确的参数在Mac OS X中工作 -P是正确的参数,在Ubuntu中测试

试试这个

//in somefile.txt:
Packet number 100 doesn't match -E
Pck number 100 doesn't match -v

使用cat somefile.txt | grep -v "Packet number \d+ doesn't match" 两条线都出现了 在Mac OS X中使用cat somefile.txt | grep -E "Packet number \d+ doesn't match" 在Linux中使用cat somefile.txt | grep -P "Packet number \d+ doesn't match" 只要 "包号100不匹配-E" 出现,这就是你想要的。

答案 2 :(得分:0)

grep的语法不支持\ d等符号。可以选择使用Perl的语法,试试这个,

cat somefile.txt | grep -v -P "Packet number \\d+ doesn't match"

请注意你需要反复使用反斜杠。