【发布时间】:2020-10-15 14:18:40
【问题描述】:
我有一个脚本,可以将 UTF-8 文本流拆分为 450 或 350 字节的行
FileType=`head -c 2 ${OutTemp}`
if [ "$FileType" == "00" ]
then
{
sed -e 's/.\{450\}/&\n/g' ${OutTemp} > ${OutFile}
}
else
{
sed -e 's/.\{350\}/&\n/g' ${OutTemp} > ${OutFile}
}
fi
这工作正常,直到它看到一个重音字符,例如它只看到 é 作为半个字符,然后错误地拆分流的其余部分,因为偏移量现在错了 1 个字符
因此,当我在看到重音字符后检查文件类型时,我得到了上一行的最后一个字符,而不是应该是行标识符的部分
0058091444033140919580126126211110110De Wit Viviane Helma Voorveldstraat 26
0052031114655110319520126126211130130Dehertoghe Eliane Josée Kapellelaan 145
030051319481130519300126126211141141Delée Paula Josephina Godshuisstraat 35
如您所见,一旦它看到 Josée,它就会“丢失”一个字符,并且现在偏移量是错误的。
我尝试使用 Iconv 将文件转换为 ISO-8859-1 或 ASCII,但结果是一样的。
iconv -f UTF-8 -t ISO-8859-1 IN200617.AAH -o IN200617.CLA
我认为必须有办法让 sed 识别 UTF-8 设置,但可惜我在这方面的技能非常有限。
提前感谢您的建议。
【问题讨论】:
-
运行的脚本被定义为 #!/bin/bash 并且正在运行 GNU Sed 4.2.2
-
无法用 GNU sed 4.7 重现。可能是您拥有的版本中的错误吗?
-
你能检查
é的值吗?在 Unicode 中,它可以是 1 个代码点/字符 [不是字节] 或 2 个代码点/字符(也可以是 2 个以上的字符)。如果您永远不应该在组合字符的中间拆分字符串。又名:sed可能不是处理通用 UTF-8 文件的最佳工具。