从字符串中提取版本号

时间:2013-05-29 15:11:45

标签: bash shell unix scripting sed

我有一个包含组件和版本号的字符串:

data-c(kuh-small1);divider-bin-1.4.4;divider-conf-1.3.3-w(1,16);storage-bin-1.5.4;storage-conf-1.5.0-w(1);worker-bin-4.5.1;worker-conf-4.4.1-c(kuh)-win2

对于shell脚本,我需要提取分隔符二进制文件的版本号。所以我需要屈服:

1.4.4

这样做的好方法是什么?用sed?

5 个答案:

答案 0 :(得分:8)

关注Kent's answers,这可行:

grep -Po '(?<=divider-bin-)\d.\d.\d'

甚至更好:

grep -Po '(?<=divider-bin-)[^;]+'

divider-bin-开始,直到找到;字符。这样任何NNN.NNN. ... . NNN格式都可以使用(无论NN多少块)。

测试:

$ echo "data-c(kuh-small1);divider-bin-1.4.4;divider-conf-1.3.3-w(1,16);storage-bin-1.5.4;storage-conf-1.5.0-w(1);worker-bin-4.5.1;worker-conf-4.4.1-c(kuh)-win2" | grep -Po '(?<=divider-bin-)[^;]+'
1.4.4
$ echo "data-c(kuh-small1);divider-bin-1.4;divider-conf-1.3.3-w(1,16);storage-bin-1.5.4;storage-conf-1.5.0-w(1);worker-bin-4.5.1;worker-conf-4.4.1-c(kuh)-win2" | grep -Po '(?<=divider-bin-)[^;]+'
1.4

答案 1 :(得分:3)

这个一般性答案应该适用于所有情况

我根据预期的输入字符串使用这三个单行命令之一:

  1. 输入字符串始终包含一个单一版本

    perl -pe '($_)=/([0-9]+([.][0-9]+)+)/' 
    
  2. 提取多个版本(多行)

    perl -pe 'if(($_)=/([0-9]+([.][0-9]+)+)/){$_.="\n"}'
    
  3. 在所有情况下提取一个单一版本(第一个)

    perl -pe 'if(($v)=/([0-9]+([.][0-9]+)+)/){print"$v\n";exit}$_=""'
    

  4. 1。最简单的

    第一个命令行没有嵌入最终换行符:

    > gcc --version | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/'
    5.3.1
    
    > bash --version | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/'
    4.2.46
    
    > perl -pe '($_)=/([0-9]+([.][0-9]+)+)/' <<< 'A2 33. Z-0.1.2.3.4..5'
    0.1.2.3.4
    
    > uname -a | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/'
    3.10.0
    
    > lsb_release | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/'
    4.1
    

    将版本存储在shell变量中:

    > v=$( gcc --version | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/' )
    > echo "GCC version is '$v'"
    GCC version is '5.3.1'
    

    但多版本号失败了:

    > gwenview --version
    Qt: 4.8.5
    KDE Development Platform: 4.14.8
    Gwenview: 4.10.4
    
    > gwenview --version | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/'
    4.8.54.14.84.10.4
    

    2。每行提取一个版本

    > gwenview --version | perl -pe 'if(($_)=/([0-9]+([.][0-9]+)+)/){$_.="\n"}' 
    4.8.4
    4.14.8
    4.10.4
    
    > mvn --version
    Apache Maven 3.0.4
    Maven home: /usr/share/maven
    Java version: 1.7.0_25, vendor: Oracle Corporation
    Java home: /usr/lib/jvm/java-7-openjdk-amd64/jre
    Default locale: fr_FR, platform encoding: UTF-8
    OS name: "linux", version: "3.11.0-13-generic", arch: "amd64", family: "unix"
    
    > mvn --version | perl -pe 'if(($_)=/([0-9]+([.][0-9]+)+)/){$_.="\n"}'
    3.0.4
    1.7.0
    3.11.0
    

    3。仅提取第一个版本

    > gwenview --version | perl -pe 'if(($v)=/([0-9]+([.][0-9]+)+)/){print"$v\n";exit}$_=""'
    4.8.5
    

    创建别名:

    > alias extractor='perl -pe '\''if(($v)=/([0-9]+([.][0-9]+)+)/){print"$v";exit}$_=""'\'''
    

    或者如果您使用的是最近的

    > alias extractor=$'perl -pe \'if(($v)=/([0-9]+([.][0-9]+)+)/){print"$v";exit}$_=""\''
    
    > v=$( mvn --version | extractor )
    > echo "The maven version is '$v'"
    The maven version is '3.0.4'
    

答案 2 :(得分:2)

sed可以轻松应对......

string="ata-c(kuh-small1);divider-bin-1.4.4;divider-conf-1.3.3-w(1,16);storage-bin-1.5.4;storage-conf-1.5.0-w(1);worker-bin-4.5.1;worker-conf-4.4.1-c(kuh)-win2"

echo $string | sed "s/^.*divider-bin-\([0-9.]*\).*/\1/"
1.4.4

还有一些其他的事情可以做些收紧......例如当你到达“;”时停止抓取版本号

sed "s/^.*divider-bin-\([^;]*\).*/\1/"

答案 3 :(得分:0)

您也可以使用perl:

perl -wne '/divider-bin-(.+?);/ and print "$1\n"

答案 4 :(得分:0)

sed -n "s/.*;divider-bin-\([0-9][^;]*\);.*/\1/p"

信息介于;divider-bin-和下一个;之间,以数字开头。这是为了确保Other-divider-bin-divider-bin-and-hex-不会干扰您的请求。另外,如果找不到则返回空字符串。 是正当的(假设版本只是数字和点)

sed -n "s/.*;divider-bin-\([0-9.]\{1,\}\)\([^0-9.;][^;]*\)*;.*/\1/p"