如何删除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
,将其删除
注:
将寄存器的内容置于光标位置“
- 如果你把它猛拉到另一个寄存器中,比如说
(猛拉到register“ay
——我称之为piglatin-yank)而忘记了把它放在哪里,你可以用a
查看寄存器的内容: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