前几天拿到一个系统的代码,编译编译不了,javac不支持UTF8-BOM的文件。通过一系列的笨方法干掉邪恶的BOM。
识别带BOM的文件
文件这么多,万一有些不带BOM,然后我又把它处理了不就很悲剧,所以先识别出带BOM的文件。知道BOM是何物的高手自然先检查一下文件开头的几个字节,这对我来说太难了,所以我用file
。
$ file BbsCategory.java
BbsCategory.java: UTF-8 Unicode (with BOM) text, with CRLF, LF line terminators
所以我们只要对全部文件用file识别一下,用grep、awk、sed过滤出全部带BOM的文件:
file `find . -name "*.java"` \
| grep '(with BOM)' \
| awk '{print $1}' \
| sed s/:// > hasbom
顺便把结果放到一个hasbom
文件里,方便检查和进行下一步。
移除BOM
我们当然可以sed
换掉文件前4个字节,sed
不熟所以直接用tail
跳过前4字节就可以了
for i in $(cat hasbom) ; do
tail --bytes=+4 $i > tmp
cp tmp $i
done
其实就是我不会用sed
而已。