Awk正则表达式匹配无结果?如何提取NextCloud版本号
解决awk提取version.php版本号的问题
刚接触awk踩点坑很正常,咱们先看看你的命令问题出在哪,再给你几个好用的解决方案:
你的命令为什么没输出?
有两个关键错误:
- 字符类语法不对:awk里的POSIX字符类(比如
[:digit:]、[:punct:])必须放在一对额外的方括号里,正确写法是[[:digit:]],不然awk会把[:digit:]当成普通字符来匹配,自然找不到符合的内容。 - 匹配目标选错了:你用
$1 ~ /.../匹配每行的第一个字段,但版本号所在的行(比如$OC_VersionString = '20.0.1';),第一个字段是$OC_VersionString,根本不是版本号格式,所以匹配不到任何内容。
几种可行的解决方案
方案1:精准匹配目标变量行(推荐)
既然你要提取的是$OC_VersionString对应的版本号,直接定位到这一行,用单引号做分隔符提取内容最稳妥:
awk -F"'" '/\$OC_VersionString/ {print $2}' version.php
-F"'":把单引号设置为字段分隔符,这样'20.0.1'就会被拆成独立的字段/\$OC_VersionString/:匹配包含$OC_VersionString的行(注意$要加转义符\,不然awk会把它当成字段变量)print $2:打印第二个字段,也就是20.0.1
方案2:用正则匹配提取版本号(通用)
如果不确定版本号在哪一行,或者想提取所有符合数字.数字.数字格式的内容,可以用这个:
awk '/[0-9]+\.[0-9]+\.[0-9]+/ {match($0, /[0-9]+\.[0-9]+\.[0-9]+/); print substr($0, RSTART, RLENGTH)}' version.php
/[0-9]+\.[0-9]+\.[0-9]+/:匹配包含类似x.y.z格式的行match($0, /.../):在当前行中找到这个正则的匹配位置,RSTART是匹配开始的索引,RLENGTH是匹配的长度substr($0, RSTART, RLENGTH):从当前行中截取匹配到的内容并打印
方案3:修正你原来的命令
如果想基于你原来的思路调整,修正字符类语法并改成匹配整行的内容:
awk '/[[:digit:]]+[[:punct:]][[:digit:]]+[[:punct:]][[:digit:]]+/ {match($0, /[[:digit:]]+[[:punct:]][[:digit:]]+[[:punct:]][[:digit:]]+/); print substr($0, RSTART, RLENGTH)}' version.php
这里把[:digit:]改成[[:digit:]],[:punct:]改成[[:punct:]],并且不再限制匹配第一个字段,而是匹配整行中的版本号模式,再提取出来。
内容的提问来源于stack exchange,提问作者J. Scott Elblein
相关产品推荐
相关产品推荐

