我有一个简单的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" (字母+数字)并返回相应的部分。有什么我想念或不了解的东西。 (抱歉打扰)
答案 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'