当试图使用grep,sed等时如何处理颜色代码

我试图用sed来处理一些正在生成彩色线的命令的输出(这是git diff,但我不认为这很重要)。 我试图在行的开始处匹配一个“+”号,但是这被“+”之前的颜色代码混淆了。 有没有简单的方法来处理这个问题,或者我需要使用一些复杂的正则expression式来匹配颜色代码。

如果可能的话,我想保留线的颜色。

如果你必须有着色,那么你将不得不做一些丑陋的事情:

$ git diff --color web-app/db/schema.rb |grep '^^[\[32m+ 

^[实际上是一个原始转义字符( Ctrl + V ESC ,bash,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版本的sedawk ,…非GNU版本的YMMV。

一个更简单的方法是转动着色:

 $ git diff --no-color file 

但是,你可以交易漂亮的输出略微丑陋的正则表达式。

实际上,没有必要处理丑陋的正则表达式。 你可以将config变量传递给你用来保存着色的git命令。

 git -c color.diff=always diff | cat 

这也适用于git status

 git -c color.status=always status -sb | cat 

这个丑陋的表情应该做到这一点

git diff --color src/Strmrs.h| grep $'^\(\x1b\[[0-9]\{1,2\}m\)\{0,1\}+'

  • $'...'会使\ x1b进入ESC字符(aka ^[ ) – 这可能是可以避免的,我懒得读取联机帮助页
  • 颜色序列(ESC,左括号,1-2位数字和字母m )被包含在\(\)外部集合中,然后使用\{0,1\}进行选择,唯一的非可选项目是最后+
  • 假定在行的开头最多只有一个颜色序列