代码之家  ›  专栏  ›  技术社区  ›  Boldewyn

使用awk删除字节顺序标记

  •  107
  • Boldewyn  · 技术社区  · 17 年前

    如何将A awk 用于删除 BOM 看起来像?

    规范:

    • NR > 1 )
    • 对于第一行:如果它以 #FE #FF #FF #FE
    5 回复  |  直到 9 年前
        1
  •  110
  •   Heath Borders    9 年前

    sed (在Linux或Cygwin上):

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

    在FreeBSD上:

    sed -i .bak '1 s/^\xef\xbb\xbf//' *.txt
    

    流编辑器 :the -i 参数表示“就地”,将更新文件,而不需要重定向或奇怪的技巧。

    在Mac上:

    This awk solution in another answer works ,但是 流编辑器 上面的命令不起作用。至少在Mac(Sierra)上是这样 流编辑器 \xef .

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

    awk '…' INFILE | sponge INFILE
    
        2
  •  122
  •   Peter Lamberg qed    8 年前

    试试这个:

    awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE
    

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

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

    awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1' INFILE > OUTFILE
    

    1

    享受!

    --附录--

    Unicode Byte Order Mark (BOM) FAQ 包括下表,其中列出了每种编码的确切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
    

    因此,您可以看到 \xef\xbb\xbf 对应于 EF BB BF UTF-8 上表中的BOM字节数。

        3
  •  41
  •   Steve Clay    16 年前

    不是awk,而是更简单:

    tail -c +4 UTF8 > UTF8.nobom
    

    要检查BOM表,请执行以下操作:

    hd -n 3 UTF8
    

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

        4
  •  20
  •   Lri    12 年前

    dos2unix 还删除BOM:

    dos2unix *.txt
    

    dos2unix 还将带有BOM的UTF-16文件(但不包括没有BOM的UTF-16文件)转换为没有BOM的UTF-8:

    $ printf '\ufeffä\n'|iconv -f utf-8 -t utf-16be>bom-utf16be
    $ printf '\ufeffä\n'|iconv -f utf-8 -t utf-16le>bom-utf16le
    $ printf '\ufeffä\n'>bom-utf8
    $ printf 'ä\n'|iconv -f utf-8 -t utf-16be>utf16be
    $ printf 'ä\n'|iconv -f utf-8 -t utf-16le>utf16le
    $ printf 'ä\n'>utf8
    $ for f in *;do printf '%11s %s\n' $f $(xxd -p $f);done
    bom-utf16be feff00e4000a
    bom-utf16le fffee4000a00
       bom-utf8 efbbbfc3a40a
        utf16be 00e4000a
        utf16le e4000a00
           utf8 c3a40a
    $ dos2unix -q *
    $ for f in *;do printf '%11s %s\n' $f $(xxd -p $f);done
    bom-utf16be c3a40a
    bom-utf16le c3a40a
       bom-utf8 c3a40a
        utf16be 00e4000a
        utf16le e4000a00
           utf8 c3a40a
    
        5
  •  2
  •   Arnon Zamir    14 年前

    我知道这个问题是针对unix/linux的,我认为值得一提的是,对于unix有挑战的人来说,这是一个很好的选择(在windows上,有UI)。
    Replace Pioneer 其中:

    批处理运行程序->搜索(查找子文件夹中的所有文件)->替换模板->二进制删除BOM(有现成的搜索和替换模板)。

    这不是最优雅的解决方案,它确实需要安装一个程序,这是一个缺点。但一旦我发现了周围发生的事情,它就非常有效(在大约2300个带有BOM的文件中找到了3个)。