我有一个大文本文件,最初在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
自动删除或替换序列的正确方法是什么?理想情况下,我想删除双引号,并用传统的单引号或撇号替换打开/关闭单引号。
答案 0 :(得分:3)
由于"除问号以外的序列中的所有内容都显示为蓝色",除问号外的所有字符都可能是二进制字符。我建议采用这种方法:
//g
Ctrl - r " {{ 1}} 输入 答案 1 :(得分:1)
很抱歉碰到一个旧线程,但是我在深夜偶然发现这一点,试图找出如何从我从网站粘贴的bind9配置文件中删除完全相同的字符。异常字符是“〜@〜X”,“〜@〜Y”,“ |”,我相信还有一个,但我现在不记得了。无论如何,使用上述方法似乎无法找到和替换正则表达式,但我能够找到解决方案。
如果可以将VIM设置为以二进制表示形式显示特殊字符,则可以使用正则表达式进行查找。这是我的操作方式:
在VIM中打开包含问题字符的文件
- (a)原始方法-
:set encoding=latin1|set isprint=|set display+=uhex
- (b)更简便的方法-
:set encoding=utf-8
注意 :这两个字符都应以二进制形式显示<<> (例如 <80>,<99>,... )
然后像这样搜索并替换为VIM正则表达式
:%s:\%xNN:':g
#用字节码(例如80、99等)替换NN
让我们分解一下命令,我们可以:
%s:
-搜索命令查找由于出现在开头的%和的而引起的所有出现。 ':' (冒号)在这种情况下用作分隔符,但是您可以使用其他符号来分隔搜索命令。
\%x
-反斜杠转义了%x,它表示我们要查找的字节码(即,<2 x个括号之间的数字>)< / em>
NN
-替换为您要在文件中替换的<>内的两个字符。 在我的情况下,字节码为<e2>, <80>, <99>
,我必须分别进行搜索。
:'
-然后,用冒号分隔替换组,在这里我指定一个单引号来替换字节码,您可以在此处放置任何文本。
:g
-最后,最后一个冒号描述和字母“ g”表示从上至下搜索整个文件。
您可以通过以下方式在VIM的帮助下进行更多研究:
:help isprint
无论如何,我希望这对以后的人有所帮助。
答案 2 :(得分:1)
如果您使用的是与Unicode兼容的编码(例如utf-8),并且您的字体支持该字体,则智能引号会正确显示。
此外,它们的二元图是6'
,6"
,9'
和9"
。这使得链接几个替代品以将其替换为直接变体非常容易:
%s/<C-k>6'\|<C-k>9'/'/g
等等将其包装在函数或命令中,以便以后使用。