perl中的正则表达式无法按预期工作

时间:2018-05-25 20:37:32

标签: regex bash perl

我有一个简单的bash脚本,它使用一行perl代码+ regex来提取必要的字符串。它看起来像

ANSWER=$(host $IPW 2>/dev/null | perl -p -e 's#^.+\s\b([a-zA-Z]{4,8}\d{1,3})(?=-\d\.).+$#\1#;'

它在很大程度上起作用,但不时会产生意想不到的匹配。例如:

$ echo "Host 31.201.188.199.in-addr.arpa. not found: 3(NXDOMAIN)" | perl -p -e 's#^.+?\s\b([a-zA-Z]{4,8}\d{1,3})(?=-\d\.).+?(?=\.$)#\1#;'

Host 31.201.188.199.in-addr.arpa. not found: 3(NXDOMAIN)

该字符串应该匹配字符串的部分,例如" server100" (字母+数字)并返回相应的部分。有什么我想念或不了解的东西。 (抱歉打扰)

2 个答案:

答案 0 :(得分:3)

您的正则表达式不匹配,因此不进行替换。因此,该行按原样打印。

如果您不想在没有匹配项时进行打印,则可以使用-n代替-p,再加上and print来打印成功替换的行:

echo "Host 31.201.188.199.in-addr.arpa. not found: 3(NXDOMAIN)" | 
    perl -n -e 's#^.+?\s\b([a-zA-Z]{4,8}\d{1,3})(?=-\d\.).+?(?=\.$)#\1# and print'

答案 1 :(得分:2)

我认为您显示的示例文本根本不应该打印出来?

我建议您使用简单匹配而不是替换。我还删除了正则表达式模式的多余部分

perl -lne 'print $1 if /.*\s([a-z]{4,8}\d{1,3})(?=-\d\.)/i'