【问题标题】:How to insert UTF-16 character with sed in a file?如何在文件中插入带有 sed 的 UTF-16 字符?
【发布时间】:2020-01-13 14:54:10
【问题描述】:

我有一个编码为 UTF-16 的文件,我想将每一行拆分为用逗号分隔的字段(在固定位置)。 我尝试了以下方法:

选项 1)

sed -i 's/./&,/400;s/./&,/360;*<and so on for several positions in the line>* FILE

这似乎可行,但是用vim编辑文件时,很明显有问题,因为逗号显示为单个字符,而其他符号显示为两个字节字符。

BEFORE: 2^@A^@U^@W^@2^@0^@1^@9^@0^@1^@0^@1^@0^@0^@0^@1^@0^@0^@

AFTER: 2^@,A^@U^@,W^@,2^@0^@1^@9^@0^@1^@0^@1^@,0^@0^@0^@1^@0^@0^@,

选项 2)

然后我再次尝试使用sed,但是我输入了逗号的UTF-16代码,而不是“,”,即002c:

sed -i "s/./&\U002c/400...

甚至

s/./&$(echo -ne '\u002c')/400...

这些选项都不起作用,结果与选项1完全相同。

【问题讨论】:

  • 请注意^@不是两个字符或字节,而是vi如何表示每个字符的UTF-16额外字节。如您所见,逗号字符由 vi 表示为单个字符“,”
  • 难道你不能把它转换成 UTF-8(比如iconv),执行你的修改,然后在你完成后将它转换回 UTF-16?更好的是,告诉 vim 正确的编码?

标签: linux bash shell unix sed


【解决方案1】:

问题不在于使用 sed 插入新字符。

我注意到该文件是 UTF-16LE(我假设它是 UTF-16BE)。我用

直接将其转换为ascii
iconv -f UTF-16LE -t ASCII sourcefile >destinationfile

然后我可以像往常一样使用 sed、grep、awk 等处理文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-15
    • 2017-05-05
    • 1970-01-01
    • 2018-08-07
    • 2017-11-10
    • 2013-09-20
    • 2012-10-14
    • 2016-07-02
    相关资源
    最近更新 更多