You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:25:15