繁体   English   中英

使用定界符循环遍历字符串(键,值)-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###

值前面有空格? 如何修剪呢?

这是在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
  1. 删除#的开头和结尾( -E解释正则表达式为扩展名)
  2. 替换#\\n
  3. 使用while读取整行包括空格
  4. 将行拆分为键值对并删除空格

您可以使用以下方法(仅适用于带有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/,/=/"您需要sed "s/,/=/;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 /,/用/ g _________替换','为'有'
  • s / \\ n \\ | $ / values&/ g ___用'values'替换每行的结尾

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM