Regex 如何使用正则表达式从Bash中的字符串中提取变量?

Regex 如何使用正则表达式从Bash中的字符串中提取变量?,regex,linux,bash,shell,Regex,Linux,Bash,Shell,绳子看起来像 str1= "the value of var1=test, the value of var2=testing, the final value of var3=testing1" 到目前为止,我用IFS=',来拆分字符串 IFS="," read -r -a final <<< "$str1" 如何使用正则表达式以最短的方式分配变量值 预期产量 var1=test var2=testing var3=testing1 这实际上是一个grep与-E扩展正则

绳子看起来像

str1= "the value of var1=test, the value of var2=testing, the final value of var3=testing1"
到目前为止,我用IFS=',来拆分字符串

IFS="," read -r -a final <<< "$str1"
如何使用正则表达式以最短的方式分配变量值

预期产量

var1=test
var2=testing
var3=testing1

这实际上是一个
grep
-E
扩展正则表达式匹配可以帮助的地方,例如

grep -E -o 'var[0-9]*[[:blank:]]*=[[:blank:]]*[^,[:blank:]]+' <<< $str
'='
两侧的
[[:blank:][]*
只允许在两侧留空格(如果存在)。如果不可能,您可以将其缩短为
grep-E-o'var[0-9]*=[^,[:blank:][]+'

按评论编辑

var1 => test
var3 => testing1
var2 => testing
要将其存储在
var1
中,只需执行以下操作:

var1=$(grep -E -o 'var[0-9]*[[:blank:]]*=[[:blank:]]*[^,[:blank:]]+' <<< $str)
示例输出

var1 => test
var3 => testing1
var2 => testing
这是因为
=~
将正则表达式中的每个匹配组存储在
BASH_REMATCH
变量的不同位置,因此我们可以选择具有名称和值的组并执行间接赋值(
printf-v varname%s“$value”
值存储在
varname
中)

正则表达式有一个相当大的部分,所以让我们一块一块地分解它:

  • (^ |[:space:]])
    确保只匹配字符串开头或前面有空格的内容
  • ([[:alpha:][[:alnum:]]*)=([^,]+)
    仅匹配左侧为有效变量名(字母,可选后跟字母或数字)的赋值。由于示例数据的值后面有逗号,我们知道值中不允许使用逗号,因此我们不允许将逗号和空格都视为值的一部分
  • ([,]|$)
    允许变量以逗号或空格结尾,或在输入结束时终止
  • (.*)
    匹配我们尚未处理的任何剩余内容,以便内容可以在循环的时间周期内针对正则表达式运行

我建议删除
str1=
“使用正则表达式”之后的空格——这样,如果以任何其他方式实现,您就不会接受功能完美的答案了?此命令仅打印具有相应值的变量,而不将值存储在变量名中。
str="the value of var1=test, the value of var2=testing, the final value of var3=testing1"
declare -A array
while read -r line; do 
    array[${line%=*}]=${line#*=}
done < <(grep -E -o 'var[0-9]*[[:blank:]]*=[[:blank:]]*[^,[:blank:]]+' <<< $str)
for i in ${!array[@]}; do
    echo "$i => ${array[$i]}"
done
var1 => test
var3 => testing1
var2 => testing
#!/usr/bin/env bash
str1="the value of var1=test, the value of var2=testing, the final value of var3=testing1"
re='(^|[[:space:]])([[:alpha:]][[:alnum:]]*)=([^, ]+)([, ]|$)(.*)'

remaining=$str1
while [[ $remaining =~ $re ]]; do
  varname=${BASH_REMATCH[2]}
  value=${BASH_REMATCH[3]}
  remaining=${BASH_REMATCH[5]}
  printf -v "$varname" %s "$value"
done

# show current values to demonstrate that variables were really assigned
declare -p var1 var2 var3