使用定界符循环遍历字符串(键,值)- 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
- 删除
#
行的开头和结尾(-E
将正则表达式解释为扩展)
- 将
#
替换为\n
- 使用 while 读取整行包括空格
- 将行拆分为键值对并删除空格
我有一个值存储在像
这样的变量中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
- 删除
#
行的开头和结尾(-E
将正则表达式解释为扩展) - 将
#
替换为\n
- 使用 while 读取整行包括空格
- 将行拆分为键值对并删除空格