重写文件中的unicode字符以转义为bash中的ascii十进制表示

时间:2016-02-20 21:25:36

标签: bash unicode utf-8

我在编译之前正在对源代码进行预处理。我需要将任何非ascii字符转换为转义的十进制等值。例如:

fun main () = print "한"; ()

必须转换成:

fun main () = print "\237\149\156"

这应该很简单,但我似乎无法弄明白。一些类似的问题建议使用iconv但似乎是编码已经转义的字符串。

重申一下,我试图使用bash命令预处理一些源代码,将所有非ascii(utf-8编码)字符转换为它们的转义十进制等效值。任何指针都会很棒!

1 个答案:

答案 0 :(得分:2)

这是使用Perl的方法:

perl -wpe 's/([^\x00-\x7F])/sprintf "\\%03d", ord $1/eg' < input > output

一些不太明显的位的解释:

  • /e标志表示将替换字符串(在本例中为sprintf "\\%03d", ord $1)视为Perl代码,并使用其结果。
  • ord接受一个字符(在本例中为单个字节)并返回其数值。
  • sprintf接受格式字符串和一系列值,并返回由format-string组成的字符串,其值已被适当替换。 %03d表示&#34;十进制整数,零填充到三位&#34;。