从 VI 中的文本文件中删除 ANSI 颜色代码

从 VI 中的文本文件中删除 ANSI 颜色代码

使用 VI/Vim 如何删除颜色编码?我发现了这一点:从流中删除 ANSI 颜色代码

来自@adam-katz @olibre 的回答

cat colored.logs | sed 's/\x1b\[[0-9;]*m//g'

我以为我可以将其转换为 vim 中的命令行,但由于未找到匹配项而失败

>vim colored.logs
: s/\x1b\[[0-9;]*m//g

答案1

转义序列(在、 C 源代码和类似的 shell 中\x1b有效)对应于 ESC(类似于键。)sedbashESC

请参阅手册页ASCII(7)

Oct   Dec  Hex  Char
------------------------------
033   27   1B   ESC (escape)

\xNN识别的C 风格序列sed采用字符的十六进制表示形式,对于 ESC 来说就是1B,这就是 的来源\x1b

Vim 无法识别\xNNC 风格的序列,但它实际上可以识别具有略微不同语法的类似序列:\%xNN,因此您可以将 ESC 序列转换为\%x1b。以下在 Vim 上有效:

:s/\%x1b\[[0-9;]*m//g

但你可以简化它。由于 ESC 是一个比较常用的符号,因此有一个特殊的快捷转义序列:\e.因此这也将起作用:

:s/\e\[[0-9;]*m//g

最后,正如你所注意到的,可以插入一个文字比赛中的 ESC 字符。

在 Vim 中,通常可以在文字字符前加上Ctrl+V组合。

因此,使用Ctrl+VESC输入此序列的一种方式。它将显示为^[,但通常采用不同的颜色,以表明它代表单个字符。此外,当移动光标时,它只会停在 之上,^而不是 之上[,以与单个字符保持一致。

你可能已经注意到在+之后使用Ctrl+也是可能的,这是因为+是[CtrlVCtrl[相同ESC。实际上,无论您在何处按下该ESC键(例如退出插入模式),您都可以等效地按Ctrl+ [,这样就可以了。因此,文字 ESC 产生的字符实际上是+^[的表示(该符号通常用于,例如,在插入模式下尝试+ ,+以查看文字字符。)Ctrl[^CtrlCtrlVCtrlA^ACtrl-A

一般来说,使用反斜杠序列(例如\e或略逊色的\%x1b)应该更好,因为将它们存储在文本文件(例如您的.vimrc)中比文字特殊字符(例如文字 ESC)更容易。

答案2

搜索和替换控制字符 vi 我发现我可以使用 CTRL-V 然后按 CTRL-[ 来代替

\x1b

这导致 :

: %s/^[\[[0-9;]*m//gc

这成功剥离了 ^[[35m、^[[39m、^[[37m ... 等等。

答案3

我偶然发现了一个类似的问题,其中terraform show包括 ANSI 颜色代码,当将输出重定向到 vim 时,它会完全混乱(例如,它有一堆^[[0m^[[1m)。

我的解决方案是使用@mancocapac 提到的技巧(即,Ctrl+v创建Ctrl+[首字母^[,然后跟随着一个模式,以使所有 ANSI 代码的变体都匹配)。

我最初尝试仅使用一个替换命令,它会匹配给定的模式,但是当输入/以开始替换部分(例如:%s/^[[.m/<replacement>/g)时,操作将无法匹配模式,因此不会替换任何内容。

我解决这个问题的方法是先搜索模式本身,然后进行替换但将模式部分留空(因为 vim 会自动使用最后匹配的模式)...

  1. /^[[.m
  2. :%s///g

这对我有用。

相关内容