Bash:匹配字符串中的子字符串并提取键值对

Bash:匹配字符串中的子字符串并提取键值对

我有预计看起来像这样的字符串:

final old-version=1.2.3-old new-version=1.2.4

我试图从字符串中提取版本号并创建两个变量,old-version其中new-version

old-version=1.2.3-old
new-version=1.2.4

这就是我想出的:

x='final old-version=1.2.3-old new-version=1.2.4'
echo $x | awk '{print $2}' | cut -d'=' -f2

使用这个我得到了 的值old-version。然而,如果由于某种原因我得到一个像这样的字符串,这种方式很快就会崩溃final new-version=1.2.4 old-version=1.2.3-old

是否有更好/更干净/更可靠的方法来提取我的子字符串及其值?

答案1

使用bash shell和PE参数扩展和读取

x='final old-version=1.2.3-old new-version=1.2.4'
read -r _ old new <<< "$x"; printf '%s\n' "${old#*=}" "${new#*=}"

或使用带有-aread 选项的数组。

x='final old-version=1.2.3-old new-version=1.2.4'
read -ra var <<< "$x"; printf '%s\n' "${var[1]#*=}" "${var[2]#*=}"

答案2

如果您不介意使用多个步骤,则可以完全使用bash内置函数来完成此操作

x='final old-version=1.2.3-old new-version=1.2.4'

oldnew=${x#* }          # "old-version=1.2.3-old new-version=1.2.4"
old=${oldnew% *}        # "old-version=1.2.3-old"
new=${oldnew#* }        # "new-version=1.2.4"

oldversion=${old#*=}    # "1.2.3-old"
newversion=${new#*=}    # "1.2.4"

echo "Old version is >$oldversion<"
echo "New version is >$newversion<"

#作为和运算符的两个示例%

  • 该构造从 string 的前面${x#* }删除与 glob 匹配的字符串。*{space}$x
  • 该构造从字符串的后面${oldnew% *}删除与 glob 匹配的字符串{space}*

这是另一个版本,这个版本要短得多,使用数组$x在空白处对变量进行切片

x='final old-version=1.2.3-old new-version=1.2.4'

oldnew=($x)                   # array ('final', 'old-version=1.2.3-old', 'new-version=1.2.4')
oldversion=${oldnew[1]#*=}    # "1.2.3-old"
newversion=${oldnew[2]#*=}    # "1.2.4"

echo "Old version is >$oldversion<"
echo "New version is >$newversion<"

相关内容