sed: parse git –line-porcelain output

esto está relacionado con esta pregunta , pero creo que merece una pregunta por separado.

git blame --line-porcelain es algo como esto

 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))) 

¿Cómo usaría sed (o grep o awk) toparse para filtrar solo el commit sha y el comitter-time? En el ejemplo anterior debería dar como resultado:

 27ce485030bf872158ceb011e6bd775d2ead5eeb 1358179206 242020d0de6363d48d32465299d07239f0a9940f 1358179709 cbfa1ec071dd30a27be82dd041ccc9c384e5ff60 1358179273 

Prefiero no depender del Ruby, aunque podría ser correcto un solo delineador.

Esto podría funcionar para usted (GNU sed):

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

Esto podría ser completamente incorrecto, pero testing esto:

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

También es posible que desee cortar las primeras dos líneas con una tail -n +2 entonada después del command. Por supuesto, esto no muestra cambios de línea por línea, pero no estoy seguro de qué piezas quieres exactamente.

Descubrí eso

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

casi resuelve mi problema, pero lo hace para el time de autoría, creo. Y realmente me gustaría aprender a analizar la --line-porcelain .