如何删除Vim中每行的最后六个字符?

如何删除Vim中每行的最后六个字符?,vim,Vim,我在每行末尾重复以下字符: ^[[00m 如何使用Vim编辑器从每行中删除它们 当我发出命令时,:%s/^[[00m//g,它不起作用。使用此命令删除: :%s/^[[00m//gc 假设这是ANSI转义序列,^[代表单个字符。必须按Ctrl+V(或Ctrl+Q)输入它在许多Windows Vim安装上),然后是Esc。请注意,这也是如何以稍微不同的颜色突出显示的。如果它们都对齐,您可以进行视觉块选择,然后将其删除 否则,如果您有一个未知如何输入的序列,您可以通过按v直观地选择它,然后标记并

我在每行末尾重复以下字符:

^[[00m
如何使用Vim编辑器从每行中删除它们

当我发出命令时,
:%s/^[[00m//g
,它不起作用。

使用此命令删除:

:%s/^[[00m//gc

假设这是ANSI转义序列,
^[
代表单个
字符。必须按Ctrl+V(或Ctrl+Q)输入它在许多Windows Vim安装上),然后是Esc。请注意,这也是如何以稍微不同的颜色突出显示的。

如果它们都对齐,您可以进行视觉块选择,然后将其删除

否则,如果您有一个未知如何输入的序列,您可以通过按
v
直观地选择它,然后标记并拖动它
y
(默认情况下将其拖动到寄存器
)。然后键入
:%s/”//g
,将其删除

注:

  • 将寄存器的内容置于光标位置
  • 如果你把它猛拉到另一个寄存器中,比如说
    “ay
    (猛拉到register
    a
    ——我称之为piglatin-yank)而忘记了把它放在哪里,你可以用
    :reg
    查看寄存器的内容
  • Vim是Ctrl+R的代言人吗

我会使用全局命令

试试这个:

:g/$/norm $xxxxxx
甚至:

:g/$/norm $5Xx

我认为解决这个问题的关键是保持它的通用性,而不是针对您试图删除的字符。这样,您所学的技术将适用于许多其他情况。

您可以使用
:%s/\{6}$/
从每行末尾删除6个字符


启动ex模式,允许您执行命令。
%
是一个范围,指定此命令应在整个文件上运行。
s
代表替换,后跟格式为
s/pattern/replacement/
的模式和替换字符串。本例中的模式是
\{6}$
表示匹配任何字符(
),精确匹配6次(
\{6}
),后跟行尾(
$
)然后用替换字符串替换它,它是空的。因此,正如我上面所说的,它匹配每行的最后6个字符,并用空替换它们。

替换每行的最后6个字符很容易,因为它们不知道这些字符是什么,但这会留下很大的错误空间,所以我不会重新记录另外,如果
^[
是转义字符,那么您实际上要查找五个字符

转义码 在字符
^[
上使用ga可以确定它是否是转义码,在这种情况下,状态栏将显示

<^[>  27,  Hex 1b,  Octal 033
由于
\%x1b
来自上面的十六进制值。还请注意,您必须转义括号(
[
),因为它是Vim regex中的保留字符。
$
确保它出现在一行的末尾,并且
/gc
标志将使其全局并确认每次替换(您可以按
a
全部替换)

非转义码 那么,逃逸就很简单了。您可以使用以下两种方法之一:

:%s/\^\[\[00m$//gc
:%s/\V^[[00m\$//gc

当管线长度超过5个字符时,这似乎可以正常工作:

:perldo $_ = substr $_, 0, -5
但是当线路长度小于等于5个字符时,它什么也不做。
也许在perl中有一种简单的方法可以删除字符串的最后5个字符,但我并不知道:)

注意到^[表示ESC字符,我会采取简单的方法:
%s/....$/
,或
%s/.00m$/
,因为ESC和
[/code>会给您带来问题,因为您不熟悉VIM(或perl!)正则表达式解析。但是,是的,“^[”这个东西会让你明白。把你的光标放在上面,注意它从来没有碰到过^[,这意味着它是一个单个字符。我发现非常有用的一点是将光标下的字符值添加到您的状态栏中,这当然是我找不到的。尝试将光标放在字符上并键入“ga”,它将显示该字符是什么。知道如何从每行中删除最后的字符是很好的,但我认为是这样的告诉每个人你正在做什么很重要。例如:
:g/$/
(每行)?,
norm
运行以下命令,
$
转到行的末尾,
xxxxxx
删除6个字符。最重要的是解释一下不太为人所知的
norm
。顺便说一句,大写的
X
类似于
X
,但向后删除。此外,您根本不需要使用全局命令。您可以将
:g/$/norm
:%norm
放在一起。也许您可以添加一个解释或参考说明,说明这是为什么以及如何工作的?如果您想选择一个而不是整个文件,请按
ctrl+v
进行视觉选择。然后
:“非常感谢您,它帮助您删除了特殊字符^@。但是,后来了解到但是,上述解决方案有助于在替换命令中进行复制粘贴。
:perldo $_ = substr $_, 0, -5