优雅的方式搜索UTF-8文件BOM?
-
03-07-2019 - |
题
为调试目的,我需要递归搜索目录的所有文件,它开始一个UTF-8字节以标记(BOM).我目前的解决方案是一个简单的shell script:
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
它不工作文件包含一个线突破, 但是,这些文件都不是可预期的。
是否有任何更短或更典雅的解决方案吗?
是否有任何有趣的文本编辑器或宏文本的编辑?
解决方案
这个简单的命令怎么样,但不仅仅是找到但是清除讨厌的BOM? :)
find . -type f -exec sed '1s/^\xEF\xBB\xBF//' -i {} \;
我喜欢“找到” :)
警告以上修改包含这三个字符的二进制文件。
如果您只想显示BOM文件,请使用以下文件:
grep -rl \xEF\xBB\xBF' .
其他提示
在Windows上执行此操作的最佳和最简单的方法:
Total Commander →去项目的根目录→查找文件( Alt + F7 )→文件类型*。*→找到文字“EF BB BF” →选中'Hex'复选框→搜索
你得到清单:)
find . -type f -print0 | xargs -0r awk '
/^\xEF\xBB\xBF/ {print FILENAME}
{nextfile}'
上面给出的大多数解决方案都比文件的第一行测试更多,即使一些(例如Marcus的解决方案)然后过滤结果。此解决方案仅测试每个文件的第一行,因此它应该更快一些。
如果您接受一些误报(如果有非文本文件,或者在不太可能的情况下文件中间有ZWNBSP),您可以使用grep:
fgrep -rl `echo -ne '\xef\xbb\xbf'` .
我会使用类似的东西:
grep -orHbm1 "^`echo -ne '\xef\xbb\xbf'`" . | sed '/:0:/!d;s/:0:.*//'
这将确保从文件的第一个字节开始发生BOM。
您可以使用 grep
查找它们,并使用Perl将它们剥离出来:
grep -rl \xEF\xBB\xBF' . | xargs perl -i -pe 's{\xEF\xBB\xBF}{}'
对于Windows用户,请参阅此(用于查找 BOM的优秀PHP脚本代码>在您的项目中。)
对此的过度解决方案是 phptags
(不是具有相同名称的vi
工具),专门查找PHP脚本:
phptags --warn ./
将输出如下内容:
./invalid.php: TRAILING whitespace ("?>\n")
./invalid.php: UTF-8 BOM alone ("\xEF\xBB\xBF")
- whitespace
模式将自动修复此类问题(递归,但断言它只重写.php脚本。)
find -type f -print0 | xargs -0 grep -l `printf '^\xef\xbb\xbf'` | sed 's/^/found BOM in: /'
find -print0
把空\0之间的每个文件的名称而不是使用新的线条xargs -0
预计空离参数,而不是分离线grep -l
列出的文件符合regex- Regex
^\xeff\xbb\xbf
不完全正确的,因为它将符合非BOMed UTF-8的文件,如果他们有零宽空间,在开始一线
我用它来纠正JavaScript文件:
find . -iname *.js -type f -exec sed 's/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;
如果您要查找UTF文件,文件命令可以正常运行。它会告诉你文件的编码是什么。如果那里有任何非ASCII字符,它将提供UTF。
file *.php | grep UTF
但这不会递归地起作用。您可能可以使用一些奇特的命令来使其递归,但我只是像下面那样单独搜索每个级别,直到我用完了级别。
file */*.php | grep UTF