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

如何获取文本文件变更对应的原始文件行号?

获取文本文件变更行号的可行方案

问题描述

我有一批文本文件,其中已产生若干变更。我需要获取原始文件中发生变更(编辑、删除、插入等任意类型)的行号列表,且仅显示行号,不允许展示实际文本变更内容。我可以将文件放入两个文件夹,或创建包含两次提交的Git仓库来处理。我曾尝试使用git diff命令,但未找到合适的选项,尝试过命令:git diff -U0 | egrep "^\+{3}|^@@" | grep -Eo '^\+.*|^@@ [-0-9,]*',请问还有哪些可行方案?


使用Git仓库的方案

完整提取所有变更行号

针对Git仓库的两次提交,可通过以下命令提取原始文件中所有变更行的行号(自动将行号范围展开为单个行号):

git diff -U0 | grep -E '^@@' | sed -E 's/@@ -([0-9]+)(,([0-9]+))? \+.*@@/\1-\1+\3/' | awk -F'-' '{if ($2 == "") print $1; else for(i=$1; i<=($1+$2-1); i++) print i}'

各部分作用:

  • git diff -U0:生成无上下文的diff结果,仅保留变更标记行
  • grep -E '^@@':筛选出标记变更范围的行(格式如@@ -10,3 +12,3 @@,其中-10,3代表原始文件从第10行开始的3行)
  • sed:提取原始文件的行号范围,转换为起始行-结束行的格式
  • awk:将行号范围展开为单个行号输出

简化版(仅输出变更块起始行号)

如果只需要每个变更块的起始行号,可使用更简洁的命令:

git diff -U0 | grep -E '^@@' | sed -E 's/@@ -([0-9]+).*@@/\1/'

使用双文件夹对比的方案

如果不用Git,直接对比两个文件夹(dir_old为原始文件目录,dir_new为变更后文件目录),可使用以下批量处理脚本:

for old_file in dir_old/*; do
  new_file="dir_new/$(basename "$old_file")"
  if [ -f "$new_file" ]; then
    diff -n "$old_file" "$new_file" | grep -E '^[0-9]+[acd][0-9]+' | awk '{print $1}'
  fi
done

各部分作用:

  • diff -n:输出带行号的diff结果,格式如10c12(原始第10行被修改)、5d3(原始第5行被删除)、8a10(新文件第10行是新增,对应原始文件第8行后插入)
  • grep:筛选出标记变更的行
  • awk:提取原始文件的行号输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 08:54:21