在Bash中基于正则拆分字符串并构建模式匹配映射的方案
解决方案
方法1:使用标准awk(无需gawk)
基于固定键集合,通过正则匹配逐个提取并构建目标键值对:
BEGIN { # 预先定义所有固定键 keys["scope1/group1"] = 1 keys["scope2/group2"] = 1 } { input = $0 for (key in keys) { pattern = key ": ([^;]+; [^;]+)" if (match(input, pattern)) { # 提取键对应的内容,去掉多余的冒号和空格 value = substr(input, RSTART + length(key) + 2, RLENGTH - length(key) - 2) printf("{%s, %s}\n", key, value) } } }
执行命令:
echo "scope1/group1: health check failure; Refer section:1; scope2/group2: config validation failure; Refer section:2" | awk -f script.awk
输出结果:
{scope1/group1, health check failure; Refer section:1} {scope2/group2, config validation failure; Refer section:2}
说明
- 借助
BEGIN块定义固定键集合,确保覆盖所有需要处理的键; - 用
match函数定位键对应的内容区域,通过substr结合RSTART、RLENGTH提取值,兼容所有POSIX标准awk; - 直接输出符合要求的格式,自动剔除值末尾多余的分号和空格。
方法2:使用sed快速格式转换
如果键的格式统一(不含冒号),可以用sed的正则替换一步完成转换:
echo "scope1/group1: health check failure; Refer section:1; scope2/group2: config validation failure; Refer section:2" | sed -E 's/([^:]+): ([^;]+; [^;]+)(; |$)/{\1, \2}\n/g' | sed '/^$/d'
说明
([^:]+)捕获键(匹配不含冒号的内容);([^;]+; [^;]+)捕获值(精准匹配“描述; Refer section:N”格式的内容);(; |$)匹配值末尾的分号空格或字符串结尾,替换为{\1, \2}\n实现换行;- 最后用
sed '/^$/d'清理可能产生的空行。
原split方案的局限
标准awk的split函数仅以分隔符拆分字符串,不会保留分隔符本身,因此无法直接将拆分后的值与对应的键关联。而上述两种方法通过主动匹配键的方式,直接建立键值对应关系,更可靠且贴合需求。
内容的提问来源于stack exchange,提问作者user3086551
相关产品推荐
相关产品推荐

