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

如何利用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:01:17