Bash环境下校验CSV中字符串是否为合法域名的问题咨询
问题修复与正确实现
原有代码错误点
- 语法问题:条件判断的
[[ ]]前后必须加空格,原代码中括号前后缺空格、混用[ ]和[[ ]]、末尾多写了],会直接触发语法报错 - 逻辑问题:仅判断字符串包含
.com等后缀,会把test.com.cn、fakecom.test这类不符合要求的内容误判为合法,且硬编码后缀的方式扩展性极差 - 位置错误:
echo "Finished!"放在循环体内,每读取一行都会输出一次,不符合预期
修复后代码(域名校验,适配域名抢注检测场景)
适用于校验每行是纯域名的场景,支持所有通用顶级域,校验逻辑符合ICANN规范:
# 若需要实时转换xlsx为csv,先安装csvkit后替换INPUT为<(in2csv 目标文件.xlsx) 即可直接读取xlsx内容,无需生成临时csv文件 INPUT=domain3.csv # 跳过CSV表头(如果文件没有表头可删除下一行) read -r header < "$INPUT" while IFS= read -r line do # 去除首尾空白字符 line=$(echo "$line" | xargs) # 空行直接跳过 [ -z "$line" ] && continue # 域名格式正则校验,支持各级子域名、所有合法顶级域 if [[ "$line" =~ ^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$ ]]; then echo "$line" else echo "$line is not a valid domain" fi done < "$INPUT" echo "Finished!"
可选扩展:完整URL合法性校验
如果需要校验带http/https前缀的完整URL,替换上面代码中的if判断条件即可:
if [[ "$line" =~ ^https?://([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}(/.*)?$ ]]; then
内容的提问来源于stack exchange,提问作者AJ9P
相关产品推荐
相关产品推荐

