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