解析 Bash 脚本中的字符串变量
Parsing String Variable in Bash Script
我正在开发一个 bash 脚本,该脚本将解析完整的字符串名称以向我提供固件值。
例如,原始字符串名称类似于:
Example_v0p1
期望的输出:
0.1
我的函数的第一部分根据下划线值分隔字符串,并将数组的第二个元素设置为一个名为 version 的变量:
arr=(`echo | tr '_' ' '`)
version=${arr[1]}
使用我提供的示例,$version 现在等于 "v0p1"。我正在寻找一种方法来进一步解析此字符串,以便它看起来像所需的输出。
如果可能的话,我希望解决方案能够处理相同格式的多种变体,这样我就可以对所有可能生成的版本代码使用相同的脚本。但是,语法将始终相同。 v#p#{p#p#....}
示例:
v0p1p1
v3p2p0p1
v1p3
期望的输出:
0.1.1
3.2.0.1
1.3
我不确定解决此问题的最佳方法。我对 REGEX 的经验不足,无法完成此操作,而且我无法想出一种合适的方法来解析字符串,因为它们的长度不同。
你可以这样做:
s='v3p2p0p1'
ver=$(sed 's/p/./g' <<< "${s:1}")
echo "$ver"
3.2.0.1
s='v0p1p1'
ver=$(sed 's/p/./g' <<< "${s:1}")
echo "$ver"
0.1.1
使用参数扩展:
#!/bin/bash
for v in v0p1p1 v3p2p0p1 v1p3 ; do
v=${v//[vp]/.} # Replace v's and p's with dots.
v=${v#.} # Remove the leading dot.
echo "$v"
done
这会起作用:
var="$(echo "v0p1p1" | tr -s 'vp' " .")"
它用 space 代替了 v
。
如果你不想这样,你可以这样做:
var=$(echo "v0p1p1" | tr -d 'v' | tr -s 'p' '.')
我正在开发一个 bash 脚本,该脚本将解析完整的字符串名称以向我提供固件值。 例如,原始字符串名称类似于:
Example_v0p1
期望的输出:
0.1
我的函数的第一部分根据下划线值分隔字符串,并将数组的第二个元素设置为一个名为 version 的变量:
arr=(`echo | tr '_' ' '`)
version=${arr[1]}
使用我提供的示例,$version 现在等于 "v0p1"。我正在寻找一种方法来进一步解析此字符串,以便它看起来像所需的输出。
如果可能的话,我希望解决方案能够处理相同格式的多种变体,这样我就可以对所有可能生成的版本代码使用相同的脚本。但是,语法将始终相同。 v#p#{p#p#....} 示例:
v0p1p1
v3p2p0p1
v1p3
期望的输出:
0.1.1
3.2.0.1
1.3
我不确定解决此问题的最佳方法。我对 REGEX 的经验不足,无法完成此操作,而且我无法想出一种合适的方法来解析字符串,因为它们的长度不同。
你可以这样做:
s='v3p2p0p1'
ver=$(sed 's/p/./g' <<< "${s:1}")
echo "$ver"
3.2.0.1
s='v0p1p1'
ver=$(sed 's/p/./g' <<< "${s:1}")
echo "$ver"
0.1.1
使用参数扩展:
#!/bin/bash
for v in v0p1p1 v3p2p0p1 v1p3 ; do
v=${v//[vp]/.} # Replace v's and p's with dots.
v=${v#.} # Remove the leading dot.
echo "$v"
done
这会起作用:
var="$(echo "v0p1p1" | tr -s 'vp' " .")"
它用 space 代替了 v
。
如果你不想这样,你可以这样做:
var=$(echo "v0p1p1" | tr -d 'v' | tr -s 'p' '.')