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

时间:2012-07-10 08:36:10

标签: vim

我在每一行的末尾都重复了以下字符:

^[[00m

如何使用Vim编辑器从每一行中删除它们?

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

7 个答案:

答案 0 :(得分:74)

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

:启动ex模式,允许您执行命令。 %是一个范围,指定此命令应对整个文件进行操作。 s代表替换,后跟一个模式,并以s/pattern/replacement/格式替换字符串。在这种情况下,我们的模式是.\{6}$,这意味着匹配任何字符(.)正好6次(\{6})后跟行尾($)并替换它用我们的替换字符串,这没什么。因此,正如我上面所说,这匹配每行的最后6个字符,并将其替换为空。

答案 1 :(得分:19)

我会使用全局命令。

试试这个:

:g/$/norm $xxxxxx

甚至:

:g/$/norm $5Xx

我认为这个问题的关键是保持它的通用性,而不是特定于你想要删除的字符。这样,您学到的技术将适用于许多其他情况。

答案 2 :(得分:6)

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

答案 3 :(得分:5)

很容易将每行不可知的最后六个字符替换为那些字符,但是它留下了相当大的错误空间,所以我不推荐它。此外,如果^[是转义字符,那么您实际上是在寻找五个字符。

逃脱代码

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

<^[>  27,  Hex 1b,  Octal 033

假设是,您可以使用

替换所有内容
:%s/\%x1b\[00m$//gc

\%x1b来自上面的十六进制值。另请注意,您必须转义括号([),因为它是Vim正则表达式中的保留字符。 $确保它出现在一行的末尾,/gc标志会将其设为全局并确认每次替换(您可以按a替换所有替换。)

不转义代码

这是一个简单的逃避问题。您可以使用以下两种方法之一:

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

答案 4 :(得分:4)

如果它们都是对齐的,您可以选择视觉块并将其删除。

否则,如果您的序列未知如何输入,您可以通过按v直观地选择它,然后标记并将其y(默认为注册")。然后键入:%s/<C-R>"//g将其删除。

注意:

  • <C-R>"将寄存器"的内容放在光标位置。
  • 如果你把它拉到另一个寄存器中,说"ay(猛烈注册a - 就像我所说的那样,把你的药片放在一边,并忘了你把它放在哪里,你可以看一下您的注册号为:reg
  • <C-R>是Vim代言 Ctrl + R

答案 5 :(得分:1)

当行超过5个字符时,这似乎工作正常:

:perldo $_ = substr $_, 0, -5

但当该行长度为5或更少时,它什么都不做。 也许在perl中有一种简单的方法可以删除字符串的最后5个字符,但我真的不知道它:)

答案 6 :(得分:0)

使用此删除:

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