Bash脚本正则匹配失败求助:语义化版本校验不生效
问题分析与解决
核心原因
你遇到的问题大概率是提取的版本号变量包含不可见控制字符(比如Windows风格的回车符\r),或者正则表达式缺少起始锚定导致匹配逻辑不严谨。
1. 隐藏控制字符的问题
如果你的test.txt是在Windows环境下创建的,文件会使用\r\n作为换行符,WSL2的Ubuntu读取时,awk提取的$2末尾会残留\r字符——虽然echo输出时看不到,但这个字符会导致正则匹配失败(因为你的正则只允许数字和点)。
2. 正则表达式的锚定缺失
你使用的正则[0-9]+(\.[0-9]+){2,3}$只有结尾锚定$,没有起始锚定^,如果变量前意外出现空格等字符,也会导致匹配失败。
解决方案
方案1:清理提取的版本号中的控制字符
修改awk命令,直接在提取时去掉\r等多余字符,同时优化命令避免不必要的管道:
appVersion=$(awk '/^appVersion:/{gsub(/\r/,""); print $2}' test.txt)
方案2:修正正则表达式
补充起始锚定^,确保版本号从开头到结尾完全匹配规则:
version_regex='^[0-9]+(\.[0-9]+){2,3}$'
完整测试脚本
#!/bin/bash # 提取并清理版本号 appVersion=$(awk '/^appVersion:/{gsub(/\r/,""); print $2}' test.txt) # 定义标准正则 version_regex='^[0-9]+(\.[0-9]+){2,3}$' # 校验逻辑 if [[ "$appVersion" =~ $version_regex ]]; then echo "版本号 $appVersion 格式合法" else echo "版本号 $appVersion 格式非法" # 排查命令:输出变量的原始字符,查看是否有隐藏字符 echo -n "$appVersion" | od -c fi
额外处理:转换文件格式
如果你的test.txt经常在Windows和Linux之间切换,可以先转换为Linux格式:
dos2unix test.txt
内容的提问来源于stack exchange,提问作者Car_mine
相关产品推荐
相关产品推荐

