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

Regex perl中的正则表达式无法按预期工作,regex,bash,perl,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

我有一个简单的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”(字母+数字)等部分匹配,并返回相应的部分。有什么我遗漏了或不明白的吗。(很抱歉打扰您)

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

如果不想在没有匹配项时打印,可以使用
-n
而不是
-p
,再加上
和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'

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

如果不想在没有匹配项时打印,可以使用
-n
而不是
-p
,再加上
和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'

我想您展示的示例文本根本不应该打印

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

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

我想您展示的示例文本根本不应该打印

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

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

没有对手。请尝试使用
、server100-4.、
注意,不需要使用
\s\b
,因为空格字母之间是单词边界。删除其中一个。此外,不需要使用
^
,因为
+
不仅会强制使用所需字符,而且会获取最后找到的字符(后面的字符)。没有匹配项。请尝试使用
、server100-4.、
注意,不需要使用
\s\b
,因为空格字母之间是单词边界。删除其中一个。另外,不需要
^
,因为
+
不仅会强制使用所需的字符,而且会获取最后一个找到的字符(后面的字符)。什么有效<代码>\s\b([a-zA-Z]{4,8}\d{1,3})(?=-\d\)与主机31.201.188.199.in-addr.arpa中的任何内容都不匹配。未找到:3(NXDOMAIN)我看不到它。哦,等等,他只是不想把它打印出来。怎么了<代码>\s\b([a-zA-Z]{4,8}\d{1,3})(?=-\d\)与主机31.201.188.199.in-addr.arpa中的任何内容都不匹配。未找到:3(NXDOMAIN)我看不到它。等等,他只是不想把它打印出来。