如何从UTF-8文件中删除BOM?

时间:2017-07-21 14:36:23

标签: linux file command-line utf-8 byte-order-mark

我有一个带有BOM的UTF-8编码文件,想要删除BOM。是否有任何linux命令行工具从文件中删除BOM?

$ file test.xml
test.xml:  XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines

6 个答案:

答案 0 :(得分:19)

BOM是Unicode代码点U + FEFF; UTF-8编码由三个十六进制值0xEF,0xBB,0xBF组成。

使用bash,您可以创建一个带有$''特殊引号形式的UTF-8 BOM,它实现了Unicode转义:$'\uFEFF'。因此,使用bash,从文本文件开头删除UTF-8 BOM的可靠方法是:

sed -i $'1s/^\uFEFF//' file.txt

如果文件没有以UTF-8 BOM开头,这将使文件保持不变,否则将删除BOM。

如果您正在使用其他shell,您可能会发现"$(printf '\ufeff')"生成BOM字符(适用于zsh以及任何没有printf内置的shell,前提是{ {1}}是Gnu版本),但是如果你想要一个与Posix兼容的版本,你可以使用:

/usr/bin/printf

sed "$(printf '1s/^\357\273\277//)" file.txt 就地编辑标志也是Gnu扩展名;此版本将可能修改的文件写入stdout。)

答案 1 :(得分:13)

使用VIM

  1. 在VIM中打开文件:

    vi text.xml
    
  2. 删除BOM编码:

    :set nobomb
    
  3. 保存并退出:

    :wq
    

答案 2 :(得分:5)

可以使用tail命令从文件中删除BOM:

tail --bytes=+4 withBOM.txt > withoutBOM.txt

答案 3 :(得分:1)

好吧,今天就处理这个问题,我的首选方式是dos2unix:

dos2unix 将删除BOM并同时照顾其他SO的其他特性:

$ sudo apt install dos2unix
$ dos2unix test.xml

也可以仅删除BOM表(-r,-remove-bom):

$ dos2unix -r test.xml

注意:已在dos2unix 7.3.4中进行了测试

答案 4 :(得分:0)

Joshua Pinter的答案在Mac上正常工作,因此我编写了一个脚本,该脚本从给定文件夹中的所有文件中删除BOM,请参阅here

它的用法如下:

从当前目录rmbom .

中的所有文件中删除BOM。

在当前目录中打印所有带有BOM表的文件:rmbom . -a

仅从扩展名为txt或cs的当前目录中的所有文件中删除BOM:rmbom . -e txt -e cs

答案 5 :(得分:0)

如果您想处理大量文件,可以通过改进 Reginaldo Santos 的回答来快速处理:

find . -name "*.java" | grep java$ | xargs -n 1 dos2unix