Regex perl中的正则表达式无法按预期工作
我有一个简单的bash脚本,它使用一行perl代码+regex来提取必要的字符串。看起来像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
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)我看不到它。等等,他只是不想把它打印出来。