Piping svn diff tworzy znaki ESC (OS X 10.7.5)

1

Dlaczego kiedy svn diffprzesyłam dane wyjściowe do, powiedzmy less, otrzymuję mnóstwo ESCznaków?

$ 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

Jeśli jednak skieruję dane wyjściowe do pliku ( svn diff > whatever.diff), a następnie less whatever.diffbędzie wyglądać dobrze?

$ 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
André Dion
źródło
@Tim: Dobra uwaga. @ André: Spróbuj użyć, less -Rjeśli jest on dostępny w OSX. To przekazuje „surowe znaki kontrolne” do terminala.
mpy

Odpowiedzi:

2

Te znaki zmiany znaczenia oznaczają części wydruku, które są kolorowe, jeśli nie są potokowane.

W oparciu o to bardzo podobne pytanie i jego odpowiedź sugeruję, abyś spróbował użyć less -Rzamiast zwykłego less.

Jeśli chcesz użyć innych narzędzi niż tylko less, możesz usunąć sekwencje za pomocą, sed 's/\x1b\[[0-9]*m//g'jak omówiono w tej odpowiedzi.

Twoje pełne polecenie byłoby wtedy

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

W systemie OS X kody specjalne są różne, więc wzorzec należy zmienić. To również wydaje się być tak, że (przy użyciu OS X) sekwencję escape \x1bbędzie współpracować z perl, ale nie z sed. Wynikowe wyrażenie, które działa zarówno w systemie Linux, jak i OS X, to:

svn diff | perl -pe "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mK]//g" | othertool
Tim
źródło
To wspaniale. Co jeśli chciałbym użyć innego programu, który nie ma takiej opcji less -R, jak Sublime ( svn diff | subl)? Czy istnieje sposób, aby powiedzieć svn diffsobie, że należy rozebrać kolory?
André Dion,
@ AndréDion Zaktualizowałem odpowiedź.
Tim
OS X rzeczywiście zawiera sed. Niestety, to nie zadziałało - wciąż mam znaki ucieczki. Jeśli zauważysz, sekwencja ucieczki we wklejonym przeze mnie fragmencie zawiera miejsce ;w wątku, do którego łączyłeś, że nie ma średników. Myślę, że regex musi być po prostu zaktualizowany, aby to uwzględnić. Charakter ucieczki jest również inny.
André Dion,
@ AndréDion Okay, kiedy testowałem to na moim systemie Linux, działało. Ale z twojego pytania wynika, że ​​kody są różne w OSX. Oznacza to, że sedwzór musi zostać zmieniony. Spróbować sed 's/\x1b\[[01];[0-9]*m//g'.
Tim
@ AndréDion Dodałem dwa rozwiązania, które zgłosiłem w Google. Zgłoś, czy działają, ponieważ nie mogę ich przetestować.
Tim