我正在尝试从响应中删除“数据包号码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+
?
答案 0 :(得分:5)
默认情况下,grep使用基本正则表达式,而\d
使用(PCRE
)语法。它不受支持,因此您需要使用([0-9]
)或([[:digit:]]
),或者使用带有-P
选项的grep
为什么[0-9]+
不起作用?
+
之类的元字符会失去意义,需要转义。您可以使用以下方法之一解决此问题:
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"
请注意你需要反复使用反斜杠。