用于匹配和提取两个版本号模式的正则表达式

Ber*_*ert 7 regex awk

我正在尝试编写一个正则表达式来匹配配置文件中的版本号。我正在尝试从以下两个编号模式中匹配并提取版本号

1) <version>2.343</version>
2) <version>2.343.2</version>
Run Code Online (Sandbox Code Playgroud)

这样返回的结果是

1) 2.343
2) 2.343.2
Run Code Online (Sandbox Code Playgroud)

我当前的解决方案 - 看起来像这两个 awk 命令之一,带有正则表达式模式来分别匹配这两种情况。但一定有一个解决方案可以涵盖这两种情况吗?

awk 'match($0, /[0-9][.][0-9][0-9][0-9]/) {print substr($0, RSTART, RLENGTH) }' config.xml
awk 'match($0, /[0-9][.][0-9][0-9][0-9].[0-9]/) {print substr($0, RSTART, RLENGTH) }' config.xml
Run Code Online (Sandbox Code Playgroud)

Rav*_*h13 9

第一个解决方案:使用您显示的示例,请尝试以下操作。使用match的函数awk,应该可以在任何 POSIX 版本中工作awk。使用正则表达式>[0-9]+(\.[0-9]+)*<匹配来自>版本的>,如果找到正则表达式匹配,则打印匹配值的子字符串。

awk 'match($0,/>[0-9]+(\.[0-9]+)*</){print substr($0,RSTART+1,RLENGTH-2)}' Input_file
Run Code Online (Sandbox Code Playgroud)

或者如果您想准确查找版本标签,请尝试以下操作:

awk 'match($0,/<version>[0-9]+(\.[0-9]+)*<\/version>/){print substr($0,RSTART+9,RLENGTH-19)}'  Input_file
Run Code Online (Sandbox Code Playgroud)

第二个解决方案:使用您显示的示例。使用 GNUawkRS变量与在其中使用正则表达式并获取值的概念相同。

awk -v RS='<version>[0-9]+(\\.[0-9]+)*<\\/version>' 'RT{split(RT,arr,"[><]");print arr[3]}' Input_file
Run Code Online (Sandbox Code Playgroud)


anu*_*ava 5

您可以使用:

awk 'match($0, /[0-9]+(\.[0-9]+)+/) {
   print $0, substr($2, RSTART, RLENGTH)}' file

1) 2.343
2) 2.343.2
Run Code Online (Sandbox Code Playgroud)

  • 如果我正确理解OP`/[0-9]+(\.[0-9]+){1,2}/`可能会更准确。 (2认同)

Jam*_*own 5

使用 GNU awk 和第三个参数match()

$ gawk 'match($0,/<version>(.*)<\/version>/,a){print a[1]}' file
2.343
2.343.2
Run Code Online (Sandbox Code Playgroud)