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

man*_*pac 8 vim colors

使用 VI/Vim 如何删除颜色编码?我发现了这个:Removing ANSI Color Codes from a Stream

来自 @adam-katz @olibre 的回答

cat colored.logs | sed 's/\x1b\[[0-9;]*m//g'
Run Code Online (Sandbox Code Playgroud)

我以为我可以将其翻译为 vim 中的命令行,但它失败了,没有找到匹配项

>vim colored.logs
: s/\x1b\[[0-9;]*m//g
Run Code Online (Sandbox Code Playgroud)

fil*_*den 9

转义\x1b序列(适用于sed,也适用于 C 源代码和 shell,如bash)对应于 ESC(如ESC键。)

请参阅ascii(7)的联机帮助页:

Oct   Dec  Hex  Char
------------------------------
033   27   1B   ESC (escape)
Run Code Online (Sandbox Code Playgroud)

\xNN识别的C 风格序列sed采用字符的十六进制表示形式,在 ESC 的情况下是1B,所以这就是它的\x1b来源。

Vim 无法识别\xNNC 风格的序列,但它实际上可以识别语法略有不同的类似序列:\%xNN,因此您可以将 ESC 序列转换为\%x1b. Vim 上的工作原理如下:

:s/\%x1b\[[0-9;]*m//g
Run Code Online (Sandbox Code Playgroud)

但你可以简化它。由于 ESC 是一个经常使用的符号,因此有一个特殊的快捷转义序列:\e。所以这也行得通:

:s/\e\[[0-9;]*m//g
Run Code Online (Sandbox Code Playgroud)

最后,正如您所注意到的,可以在匹配中插入文字ESC 字符。

在 Vim 中,通常可以通过在其前面加上Ctrl+V组合来插入文字字符。

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

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

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


man*_*pac 2

search-and-replace-control-characters vi 我发现我可以使用 CTRL-V 后跟 CTRL-[ 来替换

\x1b
Run Code Online (Sandbox Code Playgroud)

这导致 :

: %s/^[\[[0-9;]*m//gc
Run Code Online (Sandbox Code Playgroud)

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