我有一个带有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
答案 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中打开文件:
vi text.xml
删除BOM编码:
:set nobomb
保存并退出:
: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表的文件:rmbom . -a
仅从扩展名为txt或cs的当前目录中的所有文件中删除BOM:rmbom . -e txt -e cs
答案 5 :(得分:0)
如果您想处理大量文件,可以通过改进 Reginaldo Santos 的回答来快速处理:
find . -name "*.java" | grep java$ | xargs -n 1 dos2unix