我正在尝试使用sed来处理生成彩色线条的命令的一些输出(它是git diff,但我认为这不重要)。我试图在行的开头匹配一个“+”符号,但是这个颜色代码在“+”之前被混淆了。有没有一种简单的方法可以解决这个问题,或者我是否需要使用一些复杂的正则表达式来匹配颜色代码。
如果可能的话,我想保留线条的颜色。
答案 0 :(得分:3)
如果你必须有着色,那么你将不得不做一些丑陋的事情:
$ git diff --color web-app/db/schema.rb |grep '^^[\[32m+
^[
实际上是原始转义字符(bash中的 Ctrl + V ESC ,ASCII 27)。您可以使用cat -v
找出必要的转义序列:
$ git diff --color web-app/db/schema.rb |cat -v
^[[1mdiff --git a/web-app/db/schema.rb b/web-app/db/schema.rb^[[m
^[[1mindex 45451a2..411f6e1 100644^[[m
^[[1m--- a/web-app/db/schema.rb^[[m
^[[1m+++ b/web-app/db/schema.rb^[[m
...
这种事情适用于GNU版本的sed
,awk
,... YMMV与非GNU版本。
更简单的方法是改变颜色:
$ git diff --no-color file
但你可以用漂亮的输出交换稍微丑陋的正则表达式。
答案 1 :(得分:2)
实际上,无需处理难看的正则表达式。您可以将配置变量传递给您用来保存着色的git命令。
git -c color.diff=always diff | cat
这也适用于git status
git -c color.status=always status -sb | cat
答案 2 :(得分:1)
这个丑陋的表达应该这样做
git diff --color src/Strmrs.h| grep $'^\(\x1b\[[0-9]\{1,2\}m\)\{0,1\}+'
$'...'
将\ x1b设为ESC字符(又名^[
) - 这可能是可以避免的,我太懒了,无法阅读联机帮助页m
)包含在\(\)
的外部集合中,然后使用\{0,1\}
作为可选项只有非可选项是最后一个+
。