我正在努力组合
git status
和 git diff -stat
以显示修改类型和行更改。
输出1(来自
$ git status -sb
)
## main
M a
?? b
output2(来自
$ git --no-pager diff --stat | head -n-1
,无法显示新文件)
a | 2 ++
预期的最终结果应该是:
## main # header from output1 NR==1
M a | 2 ++ # output1 $1 + output2 $0; or output1 $0 + output2 $2,$3
?? b # if output1 $2 cannot be found in output2 $1, then print output1 $0
我根据awk要求合并两个文件奋斗了很长时间,但仍然卡住
我从https://stackoverflow.com/a/14984673/2940319和https://stackoverflow.com/a/64139395/2940319得到线索,并注意到:
FNR == NR
:读取第一个文件FNR != NR
:读取第二个文件所以下面的丑陋代码可以工作:
$ awk 'FNR==NR { map[$1]=$2" "$3" "$4 } FNR != NR { if ($2 in map) {print $0, map[$2]} else { print $0 } }' f2 f1
## main
M a | 2 ++
?? b
有什么优雅的方式来实现它吗?
如何才能让 git 输出中不包含 ansicolor 呢?是否可以像这样调用
awk
:
$ awk '...' <(git status -sb) <(git --no-pager diff --stat | head -n-1)
我可以保留 git 输出中的 ansicolor 吗?
ANSI 转义码只是文本的一部分,例如在支持颜色的终端模拟器中
echo -e "\033[31mtest123\033[0m" | awk '{print $0}'
使用红色字符输出
test123
,echo -e
代表任何使用ANSI转义码的命令。请记住,您必须考虑到这一点,例如
echo -e "\033[31mtest123\033[0m" | awk '$0=="test123"'
将给出空输出。请注意,当某些命令的输出被推入管道时,它们会自动脱离颜色代码,例如 GNU
grep
grep -o '[0-9]' file.txt
将从
file.txt
输出彩色数字,同时
grep -o '[0-9]' file.txt | awk '{print $0}'
将给出相同的数字,但不着色。我不知道
git
是否确实有这种行为,但在你进一步之前,我建议召唤能够告诉你这一点的git
忍者。