使用 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(类似于键。)sed
bash
ESC
请参阅手册页ASCII(7):
Oct Dec Hex Char
------------------------------
033 27 1B ESC (escape)
\xNN
识别的C 风格序列sed
采用字符的十六进制表示形式,对于 ESC 来说就是1B
,这就是 的来源\x1b
。
Vim 无法识别\xNN
C 风格的序列,但它实际上可以识别具有略微不同语法的类似序列:\%xNN
,因此您可以将 ESC 序列转换为\%x1b
。以下在 Vim 上有效:
:s/\%x1b\[[0-9;]*m//g
但你可以简化它。由于 ESC 是一个比较常用的符号,因此有一个特殊的快捷转义序列:\e
.因此这也将起作用:
:s/\e\[[0-9;]*m//g
最后,正如你所注意到的,可以插入一个文字比赛中的 ESC 字符。
在 Vim 中,通常可以在文字字符前加上Ctrl+V组合。
因此,使用Ctrl+V是ESC输入此序列的一种方式。它将显示为^[
,但通常采用不同的颜色,以表明它代表单个字符。此外,当移动光标时,它只会停在 之上,^
而不是 之上[
,以与单个字符保持一致。
你可能已经注意到在+之后使用Ctrl+也是可能的,这是因为+是[CtrlVCtrl[相同为ESC。实际上,无论您在何处按下该ESC键(例如退出插入模式),您都可以等效地按Ctrl+ [,这样就可以了。因此,文字 ESC 产生的字符实际上是+^[
的表示(该符号通常用于,例如,在插入模式下尝试+ ,+以查看文字字符。)Ctrl[^
CtrlCtrlVCtrlA^A
Ctrl-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 会自动使用最后匹配的模式)...
/^[[.m
:%s///g
这对我有用。