如何修改Shell脚本实现版本号按升序追加至配置文件正确位置
解决配置文件中版本号按升序插入的Shell脚本修改方案
原脚本的问题是仅将版本号追加到[version]行下方,未考虑版本号的排序规则。以下是修改后的脚本,能够将新版本号插入到正确的升序位置,同时修正原列表中的乱序问题:
#!/bin/bash value_to_append="$1" config_file="app.config" # 定位[version]区块的行号 version_section_line=$(grep -n "\[version\]" "$config_file" | cut -d':' -f1) # 版本列表所在行是[version]的下一行 version_list_line=$((version_section_line + 1)) # 提取并处理现有版本号:移除缩进、末尾符号,拆分为单行列表 current_versions=$(sed -n "${version_list_line}p" "$config_file" | sed 's/^[[:space:]]*//' | # 去掉行首所有空格 sed 's/[\\,]$//' | # 去掉末尾的反斜杠和逗号 tr ', ' '\n' | # 将逗号+空格分隔的版本号转为每行一个 grep -v '^$') # 过滤空行 # 加入新版本号,按版本规则排序后重构格式 new_version_line=$(echo -e "$current_versions\n$value_to_append" | sort -V | # 按版本号升序排序(支持多段数字正确排序) paste -sd ', ' - | # 用逗号+空格拼接成一行 sed 's/^/ /' | # 恢复原有的8个空格缩进 sed 's/$/, \\') # 添加上末尾的逗号和反斜杠 # 替换原文件中的版本列表行 sed -i "${version_list_line}c $new_version_line" "$config_file"
关键步骤说明
- 定位版本行:先找到
[version]的行号,版本列表固定在其下一行。 - 清理现有版本:移除行首缩进、末尾的
\和逗号,把逗号分隔的版本拆成单行,避免空格或空行干扰排序。 - 版本排序:使用
sort -V实现标准版本号排序(比如能正确识别1.2.2.10排在1.2.2.9之后)。 - 恢复格式:重构后的行保留原文件的缩进和末尾符号,保证配置文件格式一致。
注意事项
- 若使用macOS,系统自带的
sort不支持-V选项,需先通过brew install coreutils安装GNU工具集,然后将脚本中的sort替换为gsort。 - 若原配置文件的版本行缩进不是8个空格,需修改
sed 's/^/ /'中的空格数量匹配实际格式。
内容的提问来源于stack exchange,提问作者DevOps__1903
相关产品推荐
相关产品推荐

