当前位置:  开发笔记 > 编程语言 > 正文

使用BOM搜索UTF-8文件的优雅方式?

如何解决《使用BOM搜索UTF-8文件的优雅方式?》经验,为你挑选了6个好方法。

出于调试目的,我需要以递归方式在目录中搜索以UTF-8字节顺序标记(BOM)开头的所有文件.我目前的解决方案是一个简单的shell脚本:

find -type f |
while read file
do
    if [ "`head -c 3 -- "$file"`" == $'\xef\xbb\xbf' ]
    then
        echo "found BOM in: $file"
    fi
done

或者,如果您喜欢简短,不可读的单行:

find -type f|while read file;do [ "`head -c3 -- "$file"`" == $'\xef\xbb\xbf' ] && echo "found BOM in: $file";done

它不适用于包含换行符的文件名,但无论如何都不会出现这样的文件.

是否有更短或更优雅的解决方案?

文本编辑器是否有任何有趣的文本编辑器或宏?



1> 小智..:

这一个简单的命令怎么样,但不仅仅是找到但是清除讨厌的BOM?:)

find . -type f -exec sed '1s/^\xEF\xBB\xBF//' -i {} \;

我喜欢"找到":)

警告以上将修改包含这三个字符的二进制文件.

.

如果您只想显示BOM文件,请使用以下文件:

grep -rl $'\xEF\xBB\xBF' .


使用`grep -rlI $'\ xEF\xBB\xBF'.`来忽略二进制文件.
使用BOM标记错误地检测PDF ..这是因为它搜索整个文档,而不仅仅是第一行
更改sed命令以在前导's'之前添加1,因此它仅适用于第一行

2> 小智..:

在Windows上执行此操作的最佳和最简单的方法:

Total Commander →转到项目的根目录→查找文件(Alt+ F7)→文件类型*.*→查找文本"EF BB BF"→选中"Hex"复选框→搜索

你得到了清单:)


很好,尤其是使用了我长期以来最喜欢的Total指挥官,但不幸的是,这和许多其他命令一样遇到了同样的问题:它搜索文件中的所有字节,因此报告了很多图像等。通过使用RegEx而不是Hex并搜索“ ^ \ xEF \ xBB \ xBF”,可以略微改善此效果,这将消除许多图像,但仍然具有BOM处于文件中间的文件(尽管应该很少),当然在BOM表之前,恰好具有ascii换行符的任何二进制文件。尽管如此,所有图像在我的测试搜索中都消失了。

3> Aron Griffis..:
find . -type f -print0 | xargs -0r awk '
    /^\xEF\xBB\xBF/ {print FILENAME}
    {nextfile}'

上面给出的大多数解决方案都比文件的第一行测试更多,即使一些(例如Marcus的解决方案)然后过滤结果.此解决方案仅测试每个文件的第一行,因此它应该更快一些.



4> CesarB..:

如果您接受一些误报(如果有非文本文件,或者在不太可能的情况下,文件中间有ZWNBSP),您可以使用grep:

fgrep -rl `echo -ne '\xef\xbb\xbf'` .



5> Marcus Griep..:

我会使用类似的东西:

grep -orHbm1 "^`echo -ne '\xef\xbb\xbf'`" . | sed '/:0:/!d;s/:0:.*//'

这将确保从文件的第一个字节开始发生BOM.



6> theory..:

您可以使用grep它们来查找它们和Perl来将它们剥离出来,如下所示:

grep -rl $'\xEF\xBB\xBF' . | xargs perl -i -pe 's{\xEF\xBB\xBF}{}'

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有