如何获取文本文件变更对应的原始文件行号?
获取文本文件变更行号的可行方案
问题描述
我有一批文本文件,其中已产生若干变更。我需要获取原始文件中发生变更(编辑、删除、插入等任意类型)的行号列表,且仅显示行号,不允许展示实际文本变更内容。我可以将文件放入两个文件夹,或创建包含两次提交的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
相关产品推荐
相关产品推荐

