40

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

^[[00m

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

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

4

7 回答 7

84

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

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

于 2012-07-10T18:56:06.917 回答
19

我会使用全局命令。

尝试这个:

:g/$/norm $xxxxxx

甚至:

:g/$/norm $5Xx

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

于 2012-07-10T12:15:18.830 回答
6

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

于 2012-07-10T09:08:47.367 回答
5

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

转义码

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

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

假设是,您可以使用替换所有内容

:%s/\%x1b\[00m$//gc

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

不是转义码

那么逃跑就很简单了。您可以使用以下两种中的任何一种:

:%s/\^\[\[00m$//gc
:%s/\V^[[00m\$//gc
于 2012-07-12T01:16:59.957 回答
4

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

否则,如果您有一个不知道如何输入的序列,您可以通过按 直观地选择它v,然后标记并拉动它y(默认为 register ")。然后你输入:%s/<C-R>"//g删除它。

笔记:

  • <C-R>"将寄存器的内容放在"光标位置。
  • 如果您将它拉到另一个寄存器中,比如说"ay(拉到注册a- 我称之为 piglatin yank)并且忘记了放置它的位置,您可以使用 . 查看寄存器的内容:reg
  • <C-R>是 Vim 代言Ctrl+R
于 2012-07-10T09:23:22.383 回答
1

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

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

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

于 2012-07-16T20:37:11.350 回答
0

使用它来删除:

:%s/^[[00m//gc
于 2012-07-10T08:43:58.627 回答