从string中提取版本号

我有一个组件和版本号的string:

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脚本,我需要提取divider二进制文件的版本号。 所以我需要屈服:

1.4.4

什么将是一个很好的方法来做到这一点? 用sed

肯特的答案之后 ,这可以工作:

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

甚至更好:

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

它从divider-bin-斌,直到它找到; 字符。 这样的任何NNN.NNN. ... . NNN NNN.NNN. ... . NNN 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 

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/" 

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

根据预期的输入字符串,我使用以下三行之一的perl命令:

  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}$_=""' 

最简单的

第一个命令行不嵌入最后的换行符:

 > 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}$_=""'\''' 

或者如果你使用最近的bash :

 > 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' 

你也可以使用perl:

 perl -wne '/divider-bin-(.+?);/ and print "$1\n" 
 sed -n "s/.*;divider-bin-\([0-9][^;]*\);.*/\1/p" 

infos介于;divider-bin-和next ; 并从一个数字开始。 这是为了确保没有Other-divider-bin- divider-bin-and-hex-divider-bin-and-hex-会干扰你的请求。 另外,如果找不到,则返回空字符串。 详尽(假设版本只是数字和点)

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