sed:解析git --line-porcelain输出

时间:2013-01-14 16:48:05

标签: git sed blame

这与this question有关,但我认为这是一个单独的问题。

git blame --line-porcelain的输出是这样的

27ce485030bf872158ceb011e6bd775d2ead5eeb 9 36 1
author Joao Tavora
author-time 1358179206
committer Joao Tavora
committer-time 1358179206
summary initial commit
boundary
filename test.el
    (defun AB (space task next.task)
242020d0de6363d48d32465299d07239f0a9940f 19 37 1
author Joao Tavora
author-time 1358179709
committer Joao Tavora
committer-time 1358179709
summary reinstate declare
previous 11da1748d905aa9520ee3d6d9ac6a8712db0040f test.el
filename test.el
      (declare (ignore space))
cbfa1ec071dd30a27be82dd041ccc9c384e5ff60 11 38 2
author Joao Tavora
author-time 1358179273
committer Joao Tavora
committer-time 1358179273
summary use thingy
previous 69af7ace6e2b6c006c86e4fd91bf3c15ff8cec07 test.el
filename test.el
      (if (and (some.task.p (task (IP.TASK-thingy task)))

我如何使用sed(或grep或awk)toparse来过滤掉提交sha 而且是时间?在上面的例子中,它应该产生:

27ce485030bf872158ceb011e6bd775d2ead5eeb 1358179206
242020d0de6363d48d32465299d07239f0a9940f 1358179709
cbfa1ec071dd30a27be82dd041ccc9c384e5ff60 1358179273 

我宁愿不依赖红宝石,虽然perl单行可能没问题。

3 个答案:

答案 0 :(得分:4)

这可能适合你(GNU sed):

sed -r '/^[0-9a-f]{40}\b/!d;:a;/\ncommitter-time\b/bb;$!{N;ba};:b;s/\s+.*(\s.*)/\1/' file

答案 1 :(得分:0)

这可能完全是错误的,但试试这个:

git shortlog --format="%H %ct" -- <filename>

您可能还希望在命令后使用tail -n +2管道切断前几行。当然,这并没有显示逐行的变化,但我不确定你想要的是什么。

答案 2 :(得分:0)

我发现了

git blame -l -e -t -- file-to-blame | awk '{print $1 " " $3}'

几乎解决了我的问题,但我认为这是作者时间的问题。我真的想学习解析--line-porcelain输出。