我有预计看起来像这样的字符串:
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#*=}"
或使用带有-a
read 选项的数组。
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<"