[英]Regex not matching in sed
我已经使用了多年的正则表达式,从来没有遇到过这个问题。 在示例网站(如http://regexone.com/lesson/1 )上,我可以玩我正在尝试做的事情,它匹配,但在使用sed
的unix shell中,它不匹配。 我在尝试编写logcheck跳过规则时发现了这一点。
$ echo 'Hello, world!' | sed '/^\w\w\wlo, wor.*$/d'
$
工作,但是
$ echo 'Hello, world!' | sed '/^\w{3}lo, wor.*$/d'
Hello, world!
没有。 它似乎没有看到{3}的3个alphanums。
我试图通过减少来发现这一点
$ 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。
逃避大括号否则sed的默认行为是按字面顺序匹配{} or ()
:
echo 'Hello, world!' | gsed '/^\w\{3\}lo, wor.*$/d'
否则你需要-r
标志来扩展正则表达式功能:
echo 'Hello, world!' | gsed -r '/^\w{3}lo, wor.*$/d'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.