Как обрабатывать цветовые коды при попытке использовать grep, sed и т. Д. - PullRequest
7 голосов
/ 07 апреля 2011

Я пытаюсь использовать sed для обработки вывода команды, которая генерирует цветные линии (это git diff, но я не думаю, что это важно). Я пытаюсь сопоставить знак «+» в начале строки, но это смешивается с цветовой код, который предшествует «+». Есть ли простой способ решить эту проблему или мне нужно использовать сложное регулярное выражение для соответствия цветовому коду.

Если возможно, я бы хотел сохранить цвет линии.

Ответы [ 3 ]

3 голосов
/ 07 апреля 2011

Если вам нужна раскраска, вам придется сделать что-то уродливое:

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

То, что ^[ на самом деле является необработанным escape-символом ( Ctrl + V ESC в bash, ASCII 27).Вы можете использовать cat -v для определения необходимых escape-последовательностей:

$ 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

Но вы можете обменять симпатичный вывод на немного некрасивые регулярные выражения.

2 голосов
/ 23 марта 2015

Нет необходимости иметь дело с некрасивыми регулярными выражениями. Вы можете просто передать переменную config команде git, которую используете для сохранения раскраски.

git -c color.diff=always diff | cat

Это работает для git status тоже

git -c color.status=always status -sb | cat
1 голос
/ 07 апреля 2011

Это уродливое выражение должно сделать это

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

  • $'...' превратит \ x1b в символ ESC (он же ^[) - этого, вероятно, можно избежать, мне было лень читать страницу man
  • последовательность цветов (ESC, левая скобка, 1-2 цифры и буква m) заключены во внешний набор \(\), которые затем становятся необязательными с помощью \{0,1\}, единственным необязательным элементом является последний +.
  • Предполагается, что в начале строки имеется не более одной цветовой последовательности
...