107

用于删除BOMawk脚本(可能是单行脚本)会是什么样子?

规格:

  • 打印第一个 ( NR > 1)之后的每一行
  • 对于第一行:如果它以#FE #FFor开头#FF #FE,则删除它们并打印其余部分
4

5 回答 5

126

使用 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 上:

awk解决方案在另一个答案中有效,但sed上面的命令不起作用。至少在 Mac (Sierra)sed文档中没有提到支持十六进制转义 ala \xef

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

awk '…' INFILE | sponge INFILE
于 2010-09-01T21:06:02.737 回答
117

尝试这个:

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

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

或者稍微短一些,使用 awk 中的默认操作是打印记录的知识:

awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}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

因此,您可以从上表中看到如何\xef\xbb\xbf对应BOM 字节。EF BB BF UTF-8

于 2009-07-01T11:45:59.413 回答
42

不是 awk,而是更简单:

tail -c +4 UTF8 > UTF8.nobom

要检查 BOM:

hd -n 3 UTF8

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

于 2010-02-15T20:07:07.813 回答
21

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

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
于 2013-09-29T12:43:57.133 回答
3

我知道这个问题是针对 unix/linux 的,我认为值得一提的是 unix 挑战者的一个好选择(在 Windows 上,带有 UI)。
我在 WordPress 项目中遇到了同样的问题(BOM 导致 rss 提要和页面验证出现问题),我不得不查看一个相当大的目录树中的所有文件才能找到与 BOM 相关的文件。找到一个名为Replace Pioneer的应用程序并在其中:

Batch Runner -> Search(查找子文件夹中的所有文件)-> Replace Template -> Binary remove BOM(有一个现成的搜索和替换模板)。

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

于 2012-03-21T10:20:33.763 回答