【问题标题】:Remove Word smart quotes from a text file using vim使用 vim 从文本文件中删除 Word 智能引号
【发布时间】:2015-08-12 23:27:04
【问题描述】:

我有一个大文本文件,最初是在 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

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

【问题讨论】:

    标签: regex vim


    【解决方案1】:

    由于“序列中除问号之外的所有字符都显示为蓝色”,因此除问号之外的所有字符都可能是二进制字符。我建议这种方法:

    • 转到第一个序列并将其拉出:按 v 开始标记,将标记扩展到序列末尾,然后按 y
    • 将序列粘贴为未命名寄存器中的替换模式::%s/Ctrl-r"//gEnter
    • 重复其余序列。

    【讨论】:

    • 我对这个寄予厚望,但不幸的是它不起作用。当我执行 Ctrl-r" 命令时,它只是将字符粘贴为纯文本,我得到了我在原始帖子中记录的最后一个 (NFA 正则表达式) 错误。
    • @MarkHarvilla 嗯,我认为粘贴时字符不会转换为其他内容。但是,您可以尝试在替换任何内容之前切换到旧的正则表达式引擎 (:set re=1)。您还可以将\V 添加到模式的开头以使其成为文字。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      如果您可以将 VIM 设置为以二进制表示形式显示特殊字符,那么您可以使用正则表达式来查找它。我是这样做的:


      修复步骤

      1. 在VIM中打开带有问题字符的文件

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

      注意:其中任何一个都应该以二进制形式显示二合字母>> (例如 、、...

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

        :%s:\%xNN:':g #将NN替换为字节码(即80、99等)

      让我们分解那个命令,好吗:

      • %s: - 搜索命令查找所有匹配项,因为开头的 % 和 用于搜索。 ':'(冒号)在本例中用作分隔符,但您可以使用其他符号来分隔搜索命令。

      • \%x - 反斜杠转义 %x,它表示我们正在寻找的字节码 (即 )

      • NN - 替换为 中您要在文件中替换的两个字符。 就我而言,字节码是&lt;e2&gt;, &lt;80&gt;, &lt;99&gt;,我必须单独搜索。

      • :' - 然后,冒号分隔替换组,我指定单引号来替换字节码,你可以在这里放任何你想要的文本。 p>

      • :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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-10
        • 2017-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多