如何在 Vim 中的 :s/// 替换字符串中使用 Unicode 十六进制转义?

如何在 Vim 中的 :s/// 替换字符串中使用 Unicode 十六进制转义?

我想在替换命令的替换字符串中使用十六进制 Unicode 转义,即使用示例字符 U+20AC:

:s#something#\x{20AC}#g

上面的例子不起作用,因为它在替换字符串中使用 Perl 语法,但我希望它在 Vim 中工作,并且我希望它也适用于许多不同的其他可能的 Unicode 字符,由它们的十六进制值(2 或4 位数字或可能更多)。由于这是由脚本生成的一系列替换语句,因此我希望替换语句本身仅是 ASCII,因为这样更容易使用。我认为必须有一个正确的语法,但我就是找不到它。 \%u20AC 在搜索模式中有效,但在替换字符串中无效。由于这不是交互式完成的,因此 CTRL-V + 4 个十六进制数字方法将不起作用。

答案1

:s#something#\=nr2char(0x20AC)#g

请参阅Vim 中的:help sub-replace-expression和。:help nr2char()

或者,如果20AC确实是一个常数,您可以输入: s # something # <Ctrl-V> u 20AC # g <Enter>,给出

:s#something#€#g

请参阅:help i_ctrl-vVim 中的内容。

答案2

其他答案都很好;字符串插值 via:execute是一种特别适合脚本编写的方法,所以我也提到这一点。

您可以使用:help <Char>双引号字符串中的表示法:

let char = "\<Char-0x20AC>"
execute 's#something#' . char . '#g'

或者通过以下方式转换数字nr2char()

let value = 0x20AC
execute 's#something#' . nr2char(value) . '#g'

答案3

经过更多的文档阅读后,我发现至少一种非常复杂的方法来做到这一点,使用替换表达式:

:s#something#\="\<Char-0x20AC>"#g

我更喜欢它,因为它直接构建到解析器中,而不是使用 Vimscript 函数调用。

不过,人们希望有一种更简单(更直接)的方法来做到这一点。

相关内容