使用定界符循环遍历字符串(键,值)- Bash 脚本

Looping through a string(key,value) with delimiter- Bash Scripting

我有一个值存储在像

这样的变量中
input="###key1,value1###key2,value2###key3,value3###"

我想要像

这样的输出
key1 has value1 values
key2 has value2 values
key3 has value3 values

任何人都可以帮助我如何在 bash 脚本中使用循环来实现它吗?

谢谢,:)

还有一个疑问,如果

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

值前面有空格吗?如何trim那个?

您可以使用以下方法(仅适用于带有 P 标志的 grep 版本):

#!/usr/bin/env bash                                                               

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

eval $(grep -oP '[^#]*(?=###)' <<< $(echo "$input") | sed "s/,/=/")                

echo $key1                                                                      
echo $key2                                                                      
echo $key3

输出:

value1                                                                          
value2                                                                          
value3                                                                          

对于第二种情况,必须删除 = 周围的空格,因此您需要 sed "s/,/=/;s/ *//"

而不是 sed "s/,/=/"

使用 gnu sed

sed 's/##*/\n/g;s/^\n\|\n$//g;s/,/ has /g;s/\n\|$/ values&/g' <<<"$input"

  • s/##*/\n/g _________ 将每一个或多个 # 替换为 \n
  • s/^\n\|\n$//g _______ 将空的第一行和最后一行替换为空
  • s/,/ has /g_________ 将 ',' 替换为 ' has '
  • s/\n\|$/ values&/g ___replace 每行结尾按 'values'

这是在 bash.

中使用循环的一种方法
lee:~/Whosebug $ cat test.sh 
input=""

input="$(echo "$input" | sed -E 's/^#+//; s/#+$//; s/#+/\n/g;')"

echo -e "$input" | while read item; do
    k="$(echo $item | awk -F\, '{print }' | sed -E 's/^[[:space:]]+//')"
    v="$(echo $item | awk -F\, '{print }' | sed -E 's/^[[:space:]]+//')"
    echo "$k has $v values"
done

输出

lee:~/Whosebug $ bash test.sh "###key1,value1###key2,value2###key3,value3###"
key1 has value1 values
key2 has value2 values
key3 has value3 values
lee:~/Whosebug $ bash test.sh "###key1, value1###key2, value2###key3,value3###"
key1 has value1 values
key2 has value2 values
key3 has value3 values
  1. 删除#行的开头和结尾(-E将正则表达式解释为扩展)
  2. #替换为\n
  3. 使用 while 读取整行包括空格
  4. 将行拆分为键值对并删除空格