如何修复BASH_REMATCH无法正确捕获带/字符的host/url问题
问题原因
你当前使用的捕获host/url的正则表达式字符集[a-zA-Z0-9.-]+仅包含字母、数字、英文句点、短横线三类字符,没有包含URL中常见的/字符,因此正则匹配到/时就会中断,导致仅能捕获到/之后的内容。
修复方案
调整host/url的捕获正则即可,推荐使用适配性更强的通用匹配写法:
由于你的文件格式固定为# [目标内容] (host/url ok),可以直接匹配#后到下一个空格之间的所有非空格字符,无需穷举合法字符,不管后续URL出现其他合法特殊字符也能正常捕获。
完整修改后代码
while read -r line do if [[ $line =~ ^#\ ([^ ]+)\ \((host|url)\ ok\) || $line =~ ([0-9]+(\.[0-9]+){3})\ \(IP\ ok\) ]]; then host="${BASH_REMATCH[1]}" elif [[ $host != "" ]]; then if [[ $line =~ ^([0-9]+(\.[0-9]+){3}) ]]; then ip="${BASH_REMATCH[1]}" check_site $host $ip fi fi done < <(echo -e "$chunk") &
修改后可完整匹配到mysite.ch/home.html这类带路径的URL内容。
内容的提问来源于stack exchange,提问作者Marco Ferrara
相关产品推荐
相关产品推荐

