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

时间:2011-04-07 03:13:04

标签: linux bash unix sed grep

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

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

3 个答案:

答案 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版本的sedawk,... 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字符(又名^[) - 这可能是可以避免的,我太懒了,无法阅读联机帮助页
  • 颜色序列(ESC,左括号,1-2位数字和字母m)包含在\(\)的外部集合中,然后使用\{0,1\}作为可选项只有非可选项是最后一个+
  • 假设在行的开头最多有一个颜色序列