管道 svn diff 产生 ESC 字符(OS X 10.7.5)

管道 svn diff 产生 ESC 字符(OS X 10.7.5)

为什么当我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

这些转义字符标记输出中未通过管道传输的部分,这些部分会以彩色显示。

基于非常相似的问题及其答案,我建议您尝试使用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),转义序列\x1b将适用于perl但不能适用于sed。因此,适用于 Linux 和 OS X 的结果表达式为:

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

相关内容