You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用awk或sed提取版本字段拼接为VERSION 1.2.3格式字符串

提取版本号拼接为指定输出格式

问题场景

现有存储版本定义的文本文件version.txt内容如下:

set( VERSION_MAJOR 1 ) 
set( VERSION_MINOR 2 )
set( VERSION_PATCH 3 )

需要提取三个版本段的数值,拼接为VERSION 1.2.3格式写入新文件version.in。
此前的尝试通过三次awk调用分别提取到了三个版本数值,但输出为逐行单独的数字,无法拼接为点分格式的单字符串。

实现方案

方案1:单次awk遍历(推荐,效率最高)

不需要多次读取文件,单次扫描即可完成三个字段的提取和拼接,直接输出目标格式:

awk '
/VERSION_MAJOR/ { ver_major = $3 }
/VERSION_MINOR/ { ver_minor = $3 }
/VERSION_PATCH/ { ver_patch = $3 }
END { printf "VERSION %d.%d.%d\n", ver_major, ver_minor, ver_patch }
' version.txt > version.in

执行后version.in的内容即为要求的:

VERSION 1.2.3

如果要沿用之前分三次提取的逻辑,也可以先把三个值存入shell变量再拼接,只是会多次读文件,小文件场景下无感知:

maj=$(awk '/VERSION_MAJOR/{print $3;exit}' version.txt)
min=$(awk '/VERSION_MINOR/{print $3;exit}' version.txt)
pat=$(awk '/VERSION_PATCH/{print $3;exit}' version.txt)
echo "VERSION $maj.$min.$pat" > version.in

方案2:sed正则匹配实现

通过sed的保持空间暂存提取到的版本段,最终拼接输出:

sed -n '
/VERSION_MAJOR/ { s/.*VERSION_MAJOR \([0-9]\+\) .*/\1/; h }
/VERSION_MINOR/ { s/.*VERSION_MINOR \([0-9]\+\) .*/.\1/; H }
/VERSION_PATCH/ { s/.*VERSION_PATCH \([0-9]\+\) .*/.\1/; H; g; s/^/VERSION /; p }
' version.txt > version.in
  • 如果需要在已有version.in内容后追加结果,把命令里的输出重定向符>换成>>即可
  • awk方案中用数字格式化输出,会自动过滤提取值中意外混入的非数字字符,容错性更高

内容的提问来源于stack exchange,提问作者kaushal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 11:39:39