2014-07-15 28 views
3

我已经使用了多年的正则表达式,并且从来没有遇到过这个问题。在示例网站上(例如http://regexone.com/lesson/1),我可以在其中尝试执行相同的操作,但在使用sed的unix shell中,它不匹配。我试图编写logcheck跳过规则时发现了这一点。正则表达式在sed中不匹配

$ echo 'Hello, world!' | sed '/^\w\w\wlo, wor.*$/d' 
$ 

作品,但

$ echo 'Hello, world!' | sed '/^\w{3}lo, wor.*$/d' 
Hello, world! 

没有。它看起来没有看到3个带有{​​3}的字母。

我发现了这一点,试图做

$ echo "Jul 15 11:31:08 gateway-laptop dbus[3076]: [system] Successfully activated service 'org.freedesktop.PackageKit'"|sed "/^\w{3} [ :0-9]{11} [._[:alnum:]-]+ dbus\[[0-9]+\]: \[system\].*/d" 
Jul 15 11:31:08 gateway-laptop dbus[3076]: [system] Successfully activated service 'org.freedesktop.PackageKit' 

其中我本来以为应该匹配减少。降低这种复杂性,这不符合

$ echo "Jul 15 11:31:08 gateway-laptop dbus[3076]: [system] Successfully activated service 'org.freedesktop.PackageKit'"|sed "/^\w{3}.*"/d 
Jul 15 11:31:08 gateway-laptop dbus[3076]: [system] Successfully activated service 'org.freedesktop.PackageKit' 

它看起来像它的行为^ \ w {3}应该与行的第一个3个字母数字字符,则*应行的其余部分匹配EOL。

+0

更新的标签; 'bash'与此无关。 – chepner

回答

3

逃离括号否则的sed的默认行为是字面上匹配{} or()

echo 'Hello, world!' | gsed '/^\w\{3\}lo, wor.*$/d' 

否则你需要-r标志扩展正则表达式的功能:

echo 'Hello, world!' | gsed -r '/^\w{3}lo, wor.*$/d' 
+1

啊。非常棒。我没有想到这一点,因为我认为logcheck使用sed,但不使用转义。以下是logcheck附带的工作规则示例:^ \ w {3} [:0-9] {11} [._ [:alnum:] - ] + acpid:以状态0退出$ I我猜测为什么上述方法在logcheck中不起作用,但我会使用logcheck-test工具来尝试它。这回答了上述问题,所以我会将其标记为已回答。谢谢。 – narnie

+0

非常欢迎您,很高兴帮助。 – anubhava