从字符串中提取版本号

mle*_*les 5 unix bash shell 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?

fed*_*qui 9

根据肯特的回答,这可以工作:

grep -Po '(?<=divider-bin-)\d.\d.\d'
Run Code Online (Sandbox Code Playgroud)

甚至更好:

grep -Po '(?<=divider-bin-)[^;]+'
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


oli*_*bre 5

这个通用答案应该适用于所有情况

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

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

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

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

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

  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
Run Code Online (Sandbox Code Playgroud)

将版本存储在 shell 变量中:

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

但对于多版本号失败:

> 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
Run Code Online (Sandbox Code Playgroud)
  1. 每行提取一个版本

> 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
Run Code Online (Sandbox Code Playgroud)
  1. 仅提取第一个版本

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

创建别名:

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

或者如果您使用最近的

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

> v=$( mvn --version | extractor )
> echo "The maven version is '$v'"
The maven version is '3.0.4'
Run Code Online (Sandbox Code Playgroud)