使用vim

时间:2015-05-29 23:50:45

标签: regex vim

我有一个大文本文件,最初在Microsoft Word中生成,包含这四个字符序列,以及常规文本:

?~@~\
?~@~]
?~@~X
?~@~Y

从文件中写入的内容看来,序列分别对应于打开的双引号,关闭双引号,打开单引号和关闭单引号。当在Vim中显示时,除问号之外的序列中的所有内容都显示为蓝色。

不能使用

等命令删除它们
:.,$s/?~@~Y//

此命令导致vim出现以下错误:

E33: No previous substitute regular expression
E476: Invalid command
Press ENTER or type command to continue

这些命令也会产生错误:

:.,$s/\?~@~Y//
:.,$s/\?\~\@\~Y//

具体地,

E866: (NFA regexp) Misplaced ?
E476: Invalid command
Press ENTER or type command to continue

自动删除或替换序列的正确方法是什么?理想情况下,我想删除双引号,并用传统的单引号或撇号替换打开/关闭单引号。

3 个答案:

答案 0 :(得分:3)

由于"除问号以外的序列中的所有内容都显示为蓝色",除问号外的所有字符都可能是二进制字符。我建议采用这种方法:

  • 转到第一个序列并将其拉出:按 v 开始标记,将标记延伸到序列的末尾,然后按 y
  • 将序列粘贴为未命名寄存器中的替换模式://g Ctrl - r " {{ 1}} 输入
  • 重复其余序列。

答案 1 :(得分:1)

很抱歉碰到一个旧线程,但是我在深夜偶然发现这一点,试图找出如何从我从网站粘贴的bind9配置文件中删除完全相同的字符。异常字符是“〜@〜X”,“〜@〜Y”,“ |”,我相信还有一个,但我现在不记得了。无论如何,使用上述方法似乎无法找到和替换正则表达式,但我能够找到解决方案。

如果可以将VIM设置为以二进制表示形式显示特殊字符,则可以使用正则表达式进行查找。这是我的操作方式:


修复步骤

  1. 在VIM中打开包含问题字符的文件

    • (a)原始方法- :set encoding=latin1|set isprint=|set display+=uhex
    • (b)更简便的方法- :set encoding=utf-8

注意 :这两个字符都应以二进制形式显示<<> (例如 <80>,<99>,...

  1. 然后像这样搜索并替换为VIM正则表达式

    :%s:\%xNN:':g #用字节码(例如80、99等)替换NN

让我们分解一下命令,我们可以:

  • %s: -搜索命令查找由于出现在开头的%和而引起的所有出现。 ':' (冒号)在这种情况下用作分隔符,但是您可以使用其他符号来分隔搜索命令。

  • \%x -反斜杠转义了%x,它表示我们要查找的字节码(即,<2 x个括号之间的数字>)< / em>

  • NN -替换为您要在文件中替换的<>内的两个字符。 在我的情况下,字节码为<e2>, <80>, <99> ,我必须分别进行搜索。

  • :' -然后,用冒号分隔替换组,在这里我指定一个单引号来替换字节码,您可以在此处放置任何文本。

  • :g -最后,最后一个冒号描述和字母“ g”表示从上至下搜索整个文件。


您可以通过以下方式在VIM的帮助下进行更多研究:

:help isprint

无论如何,我希望这对以后的人有所帮助。


参考文献:


  1. https://blog-en.openalfa.com/how-to-edit-non-printing-and-unicode-characters-in-vim-editor

  2. https://unix.stackexchange.com/questions/108020/can-vim-display-ascii-characters-only-and-treat-other-bytes-as-binary-data

  3. VIM How do I search for a <XX> single byte representation

答案 2 :(得分:1)

如果您使用的是与Unicode兼容的编码(例如utf-8),并且您的字体支持该字体,则智能引号会正确显示。

此外,它们的二元图是6'6"9'9"。这使得链接几个替代品以将其替换为直接变体非常容易:

%s/<C-k>6'\|<C-k>9'/'/g

等等将其包装在函数或命令中,以便以后使用。