使用awk删除字节
awk
脚本(大概是单线程)如何去除BOM?
规范:
NR > 1
) #FE #FF
或#FF #FE
,请删除它们并打印剩下的部分 尝试这个:
awk 'NR==1{sub(/^xefxbbxbf/,"")}{print}' INFILE > OUTFILE
在第一条记录(行)上,删除BOM字符。 打印每条记录。
或者稍微短一些,使用awk中的默认操作是打印记录的知识:
awk 'NR==1{sub(/^xefxbbxbf/,"")}1' INFILE > OUTFILE
1
是总是评估为真的最短条件,因此每条记录都被打印。
请享用!
- 附录 -
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
因此,您可以看到xefxbbxbf
与上表中的EF BB BF
UTF-8
BOM字节的对应关系。
使用GNU sed
(在Linux或Cygwin上):
# Removing BOM from all text files in current directory:
sed -i '1 s/^xefxbbxbf//' *.txt
在FreeBSD上:
sed -i .bak '1 s/^xefxbbxbf//' *.txt
使用GNU或FreeBSD sed
优势: -i
参数意味着“到位”,并且将更新文件,而无需重定向或怪异技巧。
在Mac上:
这个awk
解决方案在另一个答案中起作用,但上面的sed
命令不起作用。 至少在Mac(Sierra) sed
文档中没有提到支持十六进制转义的ala xef
。
任何程序都可以通过从moreutils管道到sponge
工具来实现类似的技巧:
awk '…' INFILE | sponge INFILE
不awk,但更简单:
tail -c +4 UTF8 > UTF8.nobom
检查BOM:
hd -n 3 UTF8
如果BOM存在,您将看到: 00000000 ef bb bf ...
上一篇: Using awk to remove the Byte
下一篇: Fix incorrectly displayed encoding on an html document with php