使用awk删除字节顺序标记
awk
脚本(大概是单行)如何去除BOM ?
规范:
- 打印每行之后(
NR > 1
) - 对于第一行:如果以
#FE #FF
或#FF #FE
,则删除它们并打印剩下的部分
尝试这个:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE
在第一条logging(行)上,删除BOM字符。 打印每个logging。
或者稍微短一些,使用awk中的默认操作是打印logging的知识:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1' INFILE > OUTFILE
1
是总是评估为真的最短条件,所以每条logging都被打印出来。
请享用!
– 附录 –
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
因此,您可以看到\xef\xbb\xbf
对应于上表中的EF BB BF
UTF-8
BOM字节。
使用GNU 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
使用GNU或FreeBSD sed
优点: -i
参数意味着“到位”,并且将更新文件,而不需要redirect或怪异的技巧。
在Mac上:
这个awk
解决scheme在另一个答案的作品 ,但上面的sed
命令不起作用。 至less在Mac(Sierra) sed
文档中没有提到支持hex转义的ala \xef
。
任何程序都可以通过从moreutilspipe道到sponge
工具来实现类似的技巧:
awk '…' INFILE | sponge INFILE
不awk,但更简单:
tail -c +4 UTF8 > UTF8.nobom
检查BOM:
hd -n 3 UTF8
如果BOM存在,您将看到: 00000000 ef bb bf ...
除了将CRLF行结尾转换为LF之外, dos2unix
还会删除物料清单:
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
我知道这个问题是针对unix / linux,认为这是值得提到的unix挑战(在Windows上,用户界面)的一个很好的select。
我在一个WordPress项目上碰到了同样的问题(BOM导致了RSS源和页面validation的问题),我不得不查看一个相当大的目录树中的所有文件来findBOM中的文件。 find一个叫做Replace Pioneer的应用程序,并在其中:
批量转轮 – >search(查找子文件夹中的所有文件) – >replace模板 – >二进制删除BOM(有一个现成的search和replace模板)。
这不是最优雅的解决scheme,它需要安装一个程序,这是一个缺点。 但是一旦我发现周围发生了什么事情,它就像一个魅力(并发现大约2300与BOM中的3个文件)。