使用awk删除字节顺序标记

时间:2009-07-01 11:37:56

标签: unicode awk byte-order-mark

awk脚本(可能是一行代码)如何删除BOM看起来像?

规格:

  • 在第一行(NR > 1
  • 之后打印每一行
  • 代表第一行:如果以#FE #FF#FF #FE开头,请将其删除并打印其余内容

5 个答案:

答案 0 :(得分:122)

使用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参数意味着“就地”,并且将更新文件而无需重定向或奇怪的技巧。

在Mac上:

This awk solution in another answer works,但上面的sed命令不起作用。至少在Mac(Sierra)sed文档中没有提到支持十六进制转义ala \xef

通过moreutilssponge工具管道,任何程序都可以实现类似的技巧:

awk '…' INFILE | sponge INFILE

答案 1 :(得分:111)

试试这个:

awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE

在第一条记录(行)上,删除BOM字符。打印每条记录。

或略短,使用awk中默认操作打印记录的知识:

awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1' INFILE > OUTFILE

1是始终评估为true的最短条件,因此每条记录都会打印出来。

享受!

- ADDENDUM -

Unicode Byte Order Mark (BOM) FAQ包括下表,其中列出了每种编码的确切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字节的对应关系。

答案 2 :(得分:41)

不是awk,而是更简单:

tail -c +4 UTF8 > UTF8.nobom

检查物料清单:

hd -n 3 UTF8

如果BOM存在,您会看到:00000000 ef bb bf ...

答案 3 :(得分:20)

除了将CRLF行结尾转换为LF之外,dos2unix还会删除BOM:

dos2unix *.txt

dos2unix还将带有BOM(但不是没有BOM的UTF-16文件)的UTF-16文件转换为UTF-8而没有BOM:

$ 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

答案 4 :(得分:2)

我知道问题是针对unix / linux的,认为值得为unix-challenged提供一个很好的选择(在Windows上,使用UI)。
我在一个WordPress项目上遇到了同样的问题(BOM导致rss feed和页面验证出现问题),我不得不查看一个相当大的目录树中的所有文件,找到带有BOM的那个。找到了一个名为Replace Pioneer的应用程序,其中包含:

Batch Runner - >搜索(查找子文件夹中的所有文件) - >替换模板 - >二进制删除BOM(有一个现成的搜索和替换模板)。

这不是最优雅的解决方案,它确实需要安装程序,这是一个缺点。但是一旦我发现了我周围的东西,它就像一个魅力(并发现大约2300个有BOM的3个文件)。