请求提供Linux/Bash中支持问号通配符的字节敏感字符串匹配对比实现方案
实现带
?通配符的字符串对比(Bash/Linux) 我刚好有个实用的方案可以解决这个需求——咱们可以把带?通配符的模板转换成标准正则表达式,然后用Bash自带的工具或者awk来完成精确的整行匹配判断。
核心思路
模板里的?需要匹配任意单个字节,这正好对应正则表达式里的.(匹配任意单个字符)。所以我们只需要把模板中的每个?替换成.,同时转义掉模板里可能存在的正则元字符(比如.、*这类,避免它们被当作正则符号解析),然后验证目标字符串是否和转换后的正则完全匹配即可。
方法一:Bash函数+grep实现
这个方法利用Bash函数封装逻辑,搭配grep的正则匹配能力,简单直观:
compare() { local template="$1" local target="$2" # 将模板中的?替换为正则的.,同时转义正则特殊字符(. 和 *) local regex=$(printf '%s' "$template" | sed 's/\./\\./g; s/\*/\\*/g; s/\?/\./g') # 使用grep静默匹配整行,返回结果 if echo "$target" | grep -qxE "$regex"; then echo "ok" else echo "not ok" fi }
代码说明:
local关键字定义局部变量,避免污染全局环境sed命令负责转换模板:把.转义成\.,*转义成\*,最后把?替换成.grep -qxE:-q静默模式不输出内容,-x要求整行完全匹配,-E启用扩展正则(确保语法兼容)
方法二:纯awk实现
如果不想依赖多个工具,用awk单工具就能完成,效率也更高:
compare() { awk -v template="$1" -v target="$2" ' BEGIN { # 转义正则特殊字符并替换?为. gsub(/\./, "\\.", template) gsub(/\*/, "\\*", template) gsub(/\?/, ".", template) # 用^和$确保整行匹配 if (target ~ "^" template "$") { print "ok" } else { print "not ok" } }' }
代码说明:
-v选项把Bash变量传递给awkgsub函数完成字符串替换,逻辑和sed版本一致target ~ "^" template "$"验证目标字符串是否完全匹配转换后的正则
测试你的用例
把你的测试数据代入函数,就能得到预期结果:
# 定义模板和测试字符串 line0="test run ok - result is ????% - completed with success" line1="test run ok - result is 12.7% - completed with success" line2="test run ok - result is 13.4% - completed with success" line3="test run not ok - result is disatrous - kill yourself" # 执行对比 compare "$line0" "$line1" # 输出: ok compare "$line0" "$line2" # 输出: ok compare "$line0" "$line3" # 输出: not ok
注意事项
- 字节敏感:grep和awk默认都是按字节处理字符,完全满足你的需求
- 扩展转义:如果模板里还有其他正则元字符(比如
[、]、+),可以在sed/awk的替换规则里添加对应的转义,比如s/\[/\\[/g - 连续通配符:如果模板里的
?是连续的(比如????),会严格匹配目标字符串中对应位置的n个任意字符,和你的示例需求完全契合
内容的提问来源于stack exchange,提问作者uzer11542
相关产品推荐
相关产品推荐

