使用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个文件)。