如何用Unix命令或bash脚本实现配置文件内文件名带版本号的格式转换?
解决方案
sed 实现命令
直接输出结果(不修改原文件)
sed -E '/^name:/{N;s/name: ([^\.]+)\.([^\n]+)\nversion: ([0-9.]+)/name: \1-\2-\3.tar.gz\nversion: \3/}' 你的配置文件路径
直接修改原文件
- Linux 平台执行:
sed -i -E '/^name:/{N;s/name: ([^\.]+)\.([^\n]+)\nversion: ([0-9.]+)/name: \1-\2-\3.tar.gz\nversion: \3/}' 你的配置文件路径
- MacOS 平台执行:
sed -i '' -E '/^name:/{N;s/name: ([^\.]+)\.([^\n]+)\nversion: ([0-9.]+)/name: \1-\2-\3.tar.gz\nversion: \3/}' 你的配置文件路径
命令逻辑说明
- 首先匹配所有以
name:开头的行 - 执行
N命令将下一行(即version字段行)读入当前模式空间,合并两行内容做后续处理 - 正则分组捕获三个核心内容:
name字段中.前面的字符串、.后面的字符串、version字段的版本号 - 替换时将
name字段的.替换为-,拼接版本号和后缀.tar.gz,同时完整保留原version行的内容
如果你的name字段值存在多个.的情况,可以使用通用版本命令,自动替换所有.为-:
sed -E '/^name:/{h;s/name: //;s/\./-/g;x;N;s/(.*\nversion: )([0-9.]+)/\2/;G;s/([^\n]+)\n([^\n]+)/name: \2-\1.tar.gz\nversion: \1/}' 你的配置文件路径
效果验证
针对输入示例内容:
name: abc.def version: 1.0.0
执行上述命令后输出结果完全符合预期:
name: abc-def-1.0.0.tar.gz version: 1.0.0
内容的提问来源于stack exchange,提问作者atkayla
相关产品推荐
相关产品推荐

