我试图用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版本的sed
, awk
,…非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 ^[
) – 这可能是可以避免的,我懒得读取联机帮助页 m
)被包含在\(\)
外部集合中,然后使用\{0,1\}
进行选择,唯一的非可选项目是最后+
。