我正在尝试编写一个正则表达式来匹配配置文件中的版本号。我正在尝试从以下两个编号模式中匹配并提取版本号
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)
第一个解决方案:使用您显示的示例,请尝试以下操作。使用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)
第二个解决方案:使用您显示的示例。使用 GNUawk的RS变量与在其中使用正则表达式并获取值的概念相同。
awk -v RS='<version>[0-9]+(\\.[0-9]+)*<\\/version>' 'RT{split(RT,arr,"[><]");print arr[3]}' Input_file
Run Code Online (Sandbox Code Playgroud)
您可以使用:
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)
使用 GNU awk 和第三个参数match():
$ gawk 'match($0,/<version>(.*)<\/version>/,a){print a[1]}' file
2.343
2.343.2
Run Code Online (Sandbox Code Playgroud)