使用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获取单个字符串?