在vim中使用正则表达式的Unicode字符

43

我太蠢了。

有人从微软Word中把一些文本复制粘贴到了我的html文件中。

现在在文本中出现了这些Unicode字符,而不是常规的引号符号(例如,引号显示为<92>)。

我想进行正则表达式替换,但我很难选择它们。

:%s/\u92/'/g
:%s/\u5C/'/g
:%s/\x92/'/g
:%s/\x5C/'/g

...所有的尝试都失败了。我的谷歌技能也让我失望了。

3个回答

75

:help regexp(轻微编辑)中得知,在Vim中,您需要使用一些特定的语法来使用正则表达式选择Unicode字符:

\%u match specified multibyte character (eg \%u20ac)
那么,要搜索十六进制码为20AC的Unicode字符,请将其输入到搜索模式中:
\%u20ac

完整的字符搜索模式表包括一些额外选项:

\%d match specified decimal character (eg \%d123)
\%x match specified hex character (eg \%x2a)
\%o match specified octal character (eg \%o040)
\%u match specified multibyte character (eg \%u20ac)
\%U match specified large multibyte character (eg \%U12345678)

感谢您帮助我在vim的(非常长的)regexp文档中找到正确的部分,并且我看到许多人已经点赞了,但是我不同意。仅仅复制文档中没有上下文的几行内容会使这个答案变得没有用。包括左侧的三列只会让人困惑,特别是没有列标题的情况下(这里无关紧要)。我不知道这个上下文的一小部分"|/...|"应该是什么意思。它没有出现在我的vim帮助中。答案中真正有用的部分是这个:"(例如%u20ac)"。必须仔细查找才能找到它。 - Mars
1
@Mars:你应该编辑答案,使其更有帮助。在 Stack Overflow 上鼓励编辑! - michaelmichael
通常我更喜欢进行小的编辑——比如修正错别字、格式和明显的错误。我认为将一个答案变成另一个答案是不合适的。但是,在这种情况下,作者本人邀请了我,所以好吧,我想可以这样做。 - Mars
3
对于像我这样的其他愚蠢的人,整个命令是/\%u20ac。请注意,我的翻译尽可能保留了原文的意思并使其更加通俗易懂,但没有进行进一步的解释或添加额外的内容。 - Iulian Onofrei
请注意,Unicode 字符(例如 U+FFFD)与它们各自的编码(例如 UTF-8)是不同的。例如,我需要找到替换字符 �,因此使用 /\%uFFFD 进行搜索。 - Jens

3
这个解决方案可能无法解决最初描述的问题,但它确实解决了一个不同但非常相关的问题,我认为把它放在这里是有意义的。
我不知道它是在哪个版本的Vim中实现的,但我在使用7.4时尝试过。
当处于编辑模式下时,输出Unicode字符的序列为:ctrl-vuxxxx,其中xxxx是代码点。例如,输出欧元符号将是ctrl-vu20ac
我还尝试在命令模式下使用它,它也有效。也就是说,要将文档中所有出现的“20欧元”替换为“20€”,我会执行以下操作:
:%s/20 euro/20 <ctrl-v u 20ac>/gc

在上述内容中,<ctrl-v u 20ac>不是字面值,它是一系列按键,用于输出字符

0
我也遇到了同样的问题,当在CSV文件中我们能看到一些空格时,由于这个原因,我从程序中得到的输出带有Unicode值。 在vim中使用下面的Unicode命令后,问题得到了解决。
:%s/%xa0//g

enter image description here


根据目前的写法,你的回答不够清晰。请编辑以添加更多细节,帮助其他人理解如何解答所提出的问题。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接