我在每一行的末尾重复了以下字符:
^[[00m
如何使用 Vim 编辑器从每一行删除它们?
当我发出命令:%s/^[[00m//g
时,它不起作用。
您可以使用:%s/.\{6}$//
从字面上删除每行末尾的 6 个字符。
启动前模式,:
可让您执行命令。%
是一个范围,指定此命令应对整个文件进行操作。代表替换,s
后跟一个模式和格式的替换字符串s/pattern/replacement/
。在这种情况下,我们的模式.\{6}$
意味着匹配任何字符 ( .
) 正好 6 次 ( \{6}
),然后是行尾 ( $
),然后用我们的替换字符串替换它,这没什么。因此,正如我上面所说,这匹配每行的最后 6 个字符,并将它们替换为空。
我会使用全局命令。
尝试这个:
:g/$/norm $xxxxxx
甚至:
:g/$/norm $5Xx
我认为这个问题的关键是保持它的通用性,而不是特定于您要删除的字符。这样,您学习的技术将适用于许多其他情况。
假设这是一个 ANSI 转义序列,则^[
代表单个<Esc>
字符。在许多 Windows Vim 安装中,您必须通过按Ctrl+ V(或Ctrl+ )来输入它),然后按. 请注意,这也是如何以稍微不同的颜色突出显示的。QEsc
替换每行的最后六个字符与这些字符的含义无关,这很容易,但它留下了相当大的错误空间,所以我不推荐它。此外,如果^[
是一个转义字符,您实际上是在寻找五个字符。
ga在字符上使用^[
可以确定它是否是转义码,在这种情况下会显示状态栏
<^[> 27, Hex 1b, Octal 033
假设是,您可以使用替换所有内容
:%s/\%x1b\[00m$//gc
\%x1b
来自上面的十六进制值。另请注意,您必须转义方括号 ( [
),因为它是 Vim 正则表达式中的保留字符。$
确保它出现在一行的末尾,并且/gc
标志将使它成为全局并确认每次替换(您可以按a
全部替换)。
那么逃跑就很简单了。您可以使用以下两种中的任何一种:
:%s/\^\[\[00m$//gc
:%s/\V^[[00m\$//gc
如果它们都对齐,您可以进行视觉块选择并将其删除。
否则,如果您有一个不知道如何输入的序列,您可以通过按 直观地选择它v
,然后标记并拉动它y
(默认为 register "
)。然后你输入:%s/<C-R>"//g
删除它。
笔记:
<C-R>"
将寄存器的内容放在"
光标位置。"ay
(拉到注册a
- 我称之为 piglatin yank)并且忘记了放置它的位置,您可以使用 . 查看寄存器的内容:reg
。<C-R>
是 Vim 代言Ctrl+R当行超过 5 个字符时,这似乎工作正常:
:perldo $_ = substr $_, 0, -5
但是当该行长度为 5 个或更少字符时,它什么也不做。也许 perl 中有一种简单的方法可以删除字符串的最后 5 个字符,但我真的不知道:)
使用它来删除:
:%s/^[[00m//gc