1

Почему, когда я передаю вывод svn diff , скажем less , я получаю кучу символов ESC ?

$ svn diff | less

Index: test/unit/tour_guide_tip_test.rb
===================================================================
ESC[1;31m--- test/unit/tour_guide_tip_test.rb   (revision 0)ESC[0;0m
ESC[1;34m+++ test/unit/tour_guide_tip_test.rb   (revision 66)ESC[0;0m
ESC[1;35m@@ -0,0 +1,7 @@ESC[0;0m
ESC[1;34m+require 'test_helper'ESC[0;0m
ESC[1;34m+ESC[0;0m
ESC[1;34m+class TourGuideTipTest < ActiveSupport::TestCaseESC[0;0m
ESC[1;34m+  # test "the truth" doESC[0;0m
ESC[1;34m+  #   assert trueESC[0;0m
ESC[1;34m+  # endESC[0;0m
ESC[1;34m+endESC[0;0m

Тем не менее, если я перенаправлю вывод в файл (svn diff > whatever.diff), а затем less whatever.diff он будет выглядеть нормально?

$ svn diff > whatever.diff
$ less whatever.diff

Index: test/unit/tour_guide_tip_test.rb
===================================================================
--- test/unit/tour_guide_tip_test.rb    (revision 0)
+++ test/unit/tour_guide_tip_test.rb    (revision 66)
@@ -0,0 +1,7 @@
+require 'test_helper'
+
+class TourGuideTipTest < ActiveSupport::TestCase
+  # test "the truth" do
+  #   assert true
+  # end
+end

1 ответ1

2

Эти escape-символы отмечают части вывода, которые окрашены, если они не переданы по трубопроводу.

Основываясь на этом очень похожем вопросе и его ответе, я предлагаю вам попытаться использовать less -R вместо простого less .

Если вы хотите использовать другие инструменты, кроме less , вы можете удалить последовательности с помощью sed 's/\x1b\[[0-9]*m//g' как обсуждалось в этом ответе.

Ваша полная команда будет тогда

svn diff | sed 's/\x1b\[[0-9]*m//g' | othertool

В OS X коды выхода отличаются, поэтому шаблон должен быть изменен. Также кажется, что (с использованием OS X) escape-последовательность \x1b будет работать с perl но не с sed . Результирующее выражение, которое работает как для Linux, так и для OS X:

svn diff | perl -pe "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mK]//g" | othertool

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .