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