如何利用git diff提取XML中seasonTeamId的新旧变更值?
提取Git提交中XML文件的新旧变更ID
核心思路
Git diff的输出里,变更行前会带-(旧内容)和+(新内容)标记,我们可以针对这些行过滤并提取ID,避开复杂的正向预查正则(部分grep版本不支持PCRE语法)。
1. 提取单个变更的新旧ID
假设你要对比当前提交与上一次提交的XML文件(路径为path/to/your/teams.xml):
提取旧ID(被替换的ID)
git diff HEAD^ HEAD path/to/your/teams.xml | grep -E '^-<seasonTeamId>' | sed -E 's/^-<seasonTeamId>([0-9]+)<\/seasonTeamId>$/\1/'
提取新ID(替换后的ID)
git diff HEAD^ HEAD path/to/your/teams.xml | grep -E '^+<seasonTeamId>' | sed -E 's/^+<seasonTeamId>([0-9]+)<\/seasonTeamId>$/\1/'
2. 处理多ID变更的配对场景
如果一次提交修改了多个<seasonTeamId>,可以用paste命令把新旧ID一一配对:
# 先把新旧ID存入变量 OLD_IDS=$(git diff HEAD^ HEAD path/to/your/teams.xml | grep -E '^-<seasonTeamId>' | sed -E 's/^-<seasonTeamId>([0-9]+)<\/seasonTeamId>$/\1/') NEW_IDS=$(git diff HEAD^ HEAD path/to/your/teams.xml | grep -E '^+<seasonTeamId>' | sed -E 's/^+<seasonTeamId>([0-9]+)<\/seasonTeamId>$/\1/') # 配对输出 paste <(echo "$OLD_IDS") <(echo "$NEW_IDS")
3. 兼容带缩进的XML行
如果XML里的<seasonTeamId>行有缩进空格,调整正则匹配行首的空格:
# 提取旧ID(兼容缩进) git diff HEAD^ HEAD path/to/your/teams.xml | grep -E '^-\s*<seasonTeamId>' | sed -E 's/^-\s*<seasonTeamId>([0-9]+)<\/seasonTeamId>$/\1/' # 提取新ID(兼容缩进) git diff HEAD^ HEAD path/to/your/teams.xml | grep -E '^+\s*<seasonTeamId>' | sed -E 's/^+\s*<seasonTeamId>([0-9]+)<\/seasonTeamId>$/\1/'
4. 批量替换其他文件中的旧ID
把提取到的新旧ID作为变量,用sed批量修改目标文件:
paste <(echo "$OLD_IDS") <(echo "$NEW_IDS") | while read old_id new_id; do # 替换所有目标文件中的旧ID为新ID sed -i "s/$old_id/$new_id/g" path/to/target/files/*.xml path/to/target/files/*.txt done
为什么你的原正则不生效
你之前用的/(?<=<seasonTeamId>).*[0-9](?=</seasonTeamId>)/gm是PCRE正则语法,默认的grep不支持这种正向预查,必须加-P参数启用PCRE。但用上面的方法更通用,不需要依赖特定grep版本。
内容的提问来源于stack exchange,提问作者Terijaki
相关产品推荐
相关产品推荐

