Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用delimiter-Bash脚本在字符串(键、值)中循环_Bash_Loops_Key_Delimiter - Fatal编程技术网

使用delimiter-Bash脚本在字符串(键、值)中循环

使用delimiter-Bash脚本在字符串(键、值)中循环,bash,loops,key,delimiter,Bash,Loops,Key,Delimiter,我有一个值存储在一个变量中,比如 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### 也就是

我有一个值存储在一个变量中,比如

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###

也就是说,值前面有空格?如何修剪?

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


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

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

对于第二种情况,必须删除
=
周围的空格,因此使用gnu sed时需要
sed“s/,/=/”
,而不是
sed“s/,/=/;s/*/”

sed 's/##*/\n/g;s/^\n\|\n$//g;s/,/ has /g;s/\n\|$/ values&/g' <<<"$input"
sed的/##*/\n/g;s/^\n\|\n$//g;s/,/has/g;使用gnu的s/\n\|$/值和/g'

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

sed的/##*/\n/g;s/^\n\|\n$//g;s/,/has/g;s/\n\|$/values&/g'这里有一种在bash中使用循环的方法

lee:~/StackOverFlow $ cat test.sh 
input="$1"

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

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

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

  • 下面是一种在bash中使用循环的方法

    lee:~/StackOverFlow $ cat test.sh 
    input="$1"
    
    input="$(echo "$input" | sed -E 's/^#+//; s/#+$//; s/#+/\\n/g;')"
    
    echo -e "$input" | while read item; do
        k="$(echo $item | awk -F\, '{print $1}' | sed -E 's/^[[:space:]]+//')"
        v="$(echo $item | awk -F\, '{print $2}' | sed -E 's/^[[:space:]]+//')"
        echo "$k has $v values"
    done
    
    输出

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

  • 谢谢你,但我用的是最新的,看起来grep已经不起作用了。谢谢,但是,由于我使用的是最新版本,grep似乎不再有效。谢谢您的解释。:)它按预期工作。:)谢谢您的解释。:)它按预期工作。:)7调用sed,6调用awk获取单个字符串?7调用sed,6调用awk获取单个字符串?