如何从git log --oneline --graph输出中提取提交哈希值?
从git log --graph --oneline输出中提取提交哈希值
先看git log --oneline --graph的典型输出:
* 7e5dbb0 Merge |\ | * c873a96 My | * f5817ba Amazing * | f6a34ac Feature |/ * f5a51ce Other stuff
你尝试的sed命令失效,核心原因是sed默认使用基础正则表达式(BRE),此时括号()属于普通字符,无法作为捕获组使用,要么转义括号,要么启用扩展正则表达式。下面是几种可行的实现方法:
方法1:修正sed命令
方式A(启用扩展正则)
直接用-E参数开启扩展正则,无需转义括号:
git log --graph --oneline | sed -E 's/[^a-f0-9]*([a-f0-9]+).*/\1/'
方式B(基础正则转义括号)
如果不想启用扩展正则,把捕获组的括号转义即可:
git log --graph --oneline | sed 's/[^a-f0-9]*\([a-f0-9]*\).*/\1/'
两种方式都会自动过滤无哈希值的行(比如|\、|/这类),只输出哈希字符串。
方法2:用grep提取
利用grep的-o参数仅输出匹配内容,结合正则精准定位哈希:
git log --graph --oneline | grep -o '[a-f0-9]\{7\}'
这里\{7\}匹配git默认的7位短哈希,如果需要提取完整40位哈希,改成[a-f0-9]\{40\}即可。
方法3:用awk提取
awk可以按字段遍历匹配,直接定位哈希字段:
git log --graph --oneline | awk '/[a-f0-9]{7}/{print $2}'
如果哈希字段位置不固定,也可以遍历所有字段匹配:
git log --graph --oneline | awk '{for(i=1;i<=NF;i++) if($i ~ /^[a-f0-9]{7}$/) print $i}'
内容的提问来源于stack exchange,提问作者Net-worker
相关产品推荐
相关产品推荐

