在Bash脚本中解析字符串变量

时间:2015-06-18 16:35:48

标签: string bash shell parsing delimiter

我正在开发一个bash脚本,它将解析一个完整的字符串名称,以便为我提供固件值。 例如,原始字符串名称将类似于:

Example_v0p1

期望的输出:

0.1

我的函数的第一部分基于下划线值消除字符串,并将数组的第二个元素设置为等于名为version的变量:

arr=(`echo $1| tr '_' ' '`)
version=${arr[1]}

使用我提供的示例,$ version现在等于" v0p1"。我正在寻找一种方法来进一步解析这个字符串,使其看起来像所需的输出。

如果可能,我希望该解决方案能够处理相同格式的多个变体,以便我可以对可以生成的所有版本代码使用相同的脚本。然而,语法将始终相同。 v P | {P P | ....} 例子:

v0p1p1
v3p2p0p1
v1p3

期望的输出:

0.1.1 
3.2.0.1
1.3 

我不确定解决此问题的最佳方法。我没有经验丰富的REGEX来实现这一点,我无法想出一个合适的方法来解析字符串,因为它们将是不同的长度。

3 个答案:

答案 0 :(得分:3)

使用参数扩展:

#!/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

答案 1 :(得分:0)

您可以这样做:

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

答案 2 :(得分:0)

这将有效:

var="$(echo "v0p1p1" | tr -s 'vp' " .")"

它用空格替换v

如果您不希望这样做:

var=$(echo "v0p1p1" | tr -d 'v' | tr -s 'p' '.')