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

Bash脚本循环处理键值对字符串及值前空格修剪问题

没问题,我来帮你搞定这个Bash脚本的需求!咱们分两种场景一步步实现,兼顾基础功能和空格处理:

1. 基础版:处理无前置空格的输入

先看你的第一个输入场景,我们需要先清理掉首尾的###,再拆分每个key-value对,最后按要求格式输出:

input="###key1,value1###key2,value2###key3,value3###"

# 第一步:清理首尾多余的###,得到有效的key-value对列表
cleaned_input=${input###}  # 移除开头的###
cleaned_input=${cleaned_input%%###}  # 移除结尾的###

# 第二步:按###分割成数组,遍历每个key-value对
IFS='###' read -ra kv_pairs <<< "$cleaned_input"

for pair in "${kv_pairs[@]}"; do
    # 按逗号拆分key和value
    IFS=',' read -ra kv <<< "$pair"
    key=${kv[0]}
    value=${kv[1]}
    echo "$key has $value values"
done

运行这段脚本,就能得到你想要的输出:

key1 has value1 values
key2 has value2 values
key3 has value3 values

2. 进阶版:自动修剪值前的空格

如果输入里的value前面带空格(比如, value1这种格式),我们可以给value加上空格修剪逻辑,这里推荐两种高效的实现方式:

方式一:纯Bash内置方法(无外部命令,效率高)

需要开启Bash的extglob扩展来支持通配符匹配前缀空格:

input="###key1, value1###key2, value2###key3,value3###"

# 开启扩展通配符支持(用来匹配并删除前缀空格)
shopt -s extglob

cleaned_input=${input###}
cleaned_input=${cleaned_input%%###}

IFS='###' read -ra kv_pairs <<< "$cleaned_input"

for pair in "${kv_pairs[@]}"; do
    IFS=',' read -ra kv <<< "$pair"
    key=${kv[0]}
    # 移除value开头的所有空格(+([[:space:]])匹配一个或多个空格)
    value=${kv[1]##+([[:space:]])}
    echo "$key has $value values"
done

# 可选:关闭extglob,恢复默认设置
shopt -u extglob

方式二:用awk处理(无需开启扩展,兼容性好)

如果不想折腾Bash扩展,用awk直接分割并处理空格更省心:

input="###key1, value1###key2, value2###key3,value3###"

cleaned_input=${input###}
cleaned_input=${cleaned_input%%###}

IFS='###' read -ra kv_pairs <<< "$cleaned_input"

for pair in "${kv_pairs[@]}"; do
    # 用awk指定分隔符为"逗号+任意空格",直接输出格式化内容
    echo "$pair" | awk -F ',[[:space:]]*' '{print $1 " has " $2 " values"}'
done

这两种方式都能完美处理带空格的输入,输出和基础版完全一致,不管value前有没有空格都能正确修剪。

内容的提问来源于stack exchange,提问作者Mahesh Mohan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:02:28