awk脚本(大概是单行)如何去除BOM ?
规范:
打印每行之后( NR > 1 )
对于第一行:如果以#FE #FF或#FF #FE ,则删除它们并打印剩下的部分
是否允许在UNIX脚本文件的开始处使用Unicode字节顺序标记?
PHP Streaming CSV总是添加UTF-8 BOM
heroku不能加载语言文件
尝试这个:
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 ...
除了将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 %sn' $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 %sn' $f $(xxd -p $f);done bom-utf16be c3a40a bom-utf16le c3a40a bom-utf8 c3a40a utf16be 00e4000a utf16le e4000a00 utf8 c3a40a
我知道这个问题是针对unix / linux,认为这是值得提到的unix挑战(在Windows上,用户界面)的一个很好的选择。
我在一个wordpress项目上碰到了同样的问题(BOM导致了RSS提要和页面验证的问题),我不得不查看一个相当大的目录树中的所有文件来找到BOM中的文件。 找到一个叫做Replace Pioneer的应用程序,并在其中:
批量转轮 – >搜索(查找子文件夹中的所有文件) – >替换模板 – >二进制删除BOM(有一个现成的搜索和替换模板)。
这不是最优雅的解决方案,它需要安装一个程序,这是一个缺点。 但是一旦我发现周围发生了什么事情,它就像一个魅力一样(在2300个BOM中找到了3个文件)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。