微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用awk删除字节顺序标记

awk脚本(大概是单行)如何去除BOM ?

规范:

打印每行之后( NR > 1 )

对于第一行:如果以#FE #FF或#FF #FE ,则删除它们并打印剩下的部分

BOM中由wordpress自动生成PHP页面

是否允许在UNIX脚本文件的开始处使用Unicode字节顺序标记

查找目录中的所有.PHP文件与777权限

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] 举报,一经查实,本站将立刻删除。

相关推荐