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
相关产品推荐
相关产品推荐

