使用awk删除字节

awk脚本(大概是单线程)如何去除BOM?

规范:

  • 在第一行之后打印每行( NR > 1
  • 对于第一行:如果以#FE #FF#FF #FE ,请删除它们并打印剩下的部分

  • 尝试这个:

    awk 'NR==1{sub(/^xefxbbxbf/,"")}{print}' INFILE > OUTFILE
    

    在第一条记录(行)上,删除BOM字符。 打印每条记录。

    或者稍微短一些,使用awk中的默认操作是打印记录的知识:

    awk 'NR==1{sub(/^xefxbbxbf/,"")}1' INFILE > OUTFILE
    

    1是总是评估为真的最短条件,因此每条记录都被打印。

    请享用!

    - 附录 -

    Unicode字节顺序标记(BOM)常见问题包括下表,其中列出了每种编码的确切BOM字节:

    Bytes         |  Encoding Form
    --------------------------------------
    00 00 FE FF   |  UTF-32, big-endian
    FF FE 00 00   |  UTF-32, little-endian
    FE FF         |  UTF-16, big-endian
    FF FE         |  UTF-16, little-endian
    EF BB BF      |  UTF-8
    

    因此,您可以看到xefxbbxbf与上表中的EF BB BF UTF-8 BOM字节的对应关系。


    使用GNU sed (在Linux或Cygwin上):

    # Removing BOM from all text files in current directory:
    sed -i '1 s/^xefxbbxbf//' *.txt
    

    在FreeBSD上:

    sed -i .bak '1 s/^xefxbbxbf//' *.txt
    

    使用GNU或FreeBSD sed优势: -i参数意味着“到位”,并且将更新文件,而无需重定向或怪异技巧。

    在Mac上:

    这个awk解决方案在另一个答案中起作用,但上面的sed命令不起作用。 至少在Mac(Sierra) sed文档中没有提到支持十六进制转义的ala xef

    任何程序都可以通过从moreutils管道到sponge工具来实现类似的技巧:

    awk '…' INFILE | sponge INFILE
    

    不awk,但更简单:

    tail -c +4 UTF8 > UTF8.nobom
    

    检查BOM:

    hd -n 3 UTF8
    

    如果BOM存在,您将看到: 00000000 ef bb bf ...

    链接地址: http://www.djcxy.com/p/34675.html

    上一篇: Using awk to remove the Byte

    下一篇: Fix incorrectly displayed encoding on an html document with php