【问题标题】:File with no \n split into lines fails to break evenly when encountering accented characters遇到重音字符时,没有 \n 拆分为行的文件无法均匀拆分
【发布时间】: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 文件的最佳工具。

标签: sed utf-8 split


【解决方案1】:

看来 sed 确实不是正确的工具。我改用 Perl 重写了它

FileType=`head -c 2 ${OutTemp}`

if [ "$FileType" == "00" ] 
then
    {
     perl -pe 's/(.{450})/$1\n/g' ${OutTemp} > ${OutFile}
     }
else
    {
     perl -pe 's/(.{350})/$1\n/g' ${OutTemp} > ${OutFile}
    }
fi

【讨论】:

  • 如果您确实使用的是 GNU sed,则您的语言环境设置很可能是错误的。 thenelse 块周围的大括号完全是多余的。
猜你喜欢
  • 1970-01-01
  • 2019-02-17
  • 2014-02-16
  • 1970-01-01
  • 2019-10-05
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
相关资源
最近更新 更多