linux – 如何检测文件在Bash中是否具有UTF-8 BOM?

我正在尝试编写一个脚本,将自动文件删除UTF-8 BOM.我无法检测文件是否有第一个.这是我的代码
function has-bom {
    # Test if the file starts with 0xEF,0xBB,and 0xBF
    head -c 3 "$1" | grep -P '\xef\xbb\xbf'
    return $?
}

由于某种原因,头似乎忽略了文件前面的BOM.举个例子,运行这个

printf '\xef\xbb\xbf' > file
head -c 3 file

不会打印任何东西.

我试着寻找一个可以帮助我解决这个问题的选项,但没有运气.有什么可以做的,使这项工作吗?

解决方法

首先,我们来证明头部实际工作正常:
$printf '\xef\xbb\xbf' >file
$head -c 3 file 
$head -c 3 file | hexdump -C
00000000  ef bb bf                                          |...|
00000003

现在,我们来创建一个工作函数has_bom.如果你的grep支持-P,那么一个选项是:

$has_bom() { head -c3 "$1" | LC_ALL=C grep -qP '\xef\xbb\xbf'; }
$has_bom file && echo yes
yes

目前,只有GNU grep支持-P.

一个选择是使用bash的$’…’:

$has_bom() { head -c3 "$1" | grep -q $'\xef\xbb\xbf'; }
$has_bom file && echo yes
yes

ksh和zsh也支持$’…’,但是这个结构不是POSIX,破折号不支持它.

笔记:

>使用明确的return $?是可选的.认情况下,该函数将返回与最后一个命令运行的退出代码.
>我已经使用POSIX窗体来定义函数.这相当于bash形式,但是如果您必须在另一个shell下运行该功能,则可以减少处理的问题.
> bash确实接受使用字符 – 在函数名中,但这是一个有争议的功能.我把它换成了更广泛接受的_ (有关此问题的更多信息,请参阅this answer.)> grep make的-q选项是安静的,这意味着它仍然设置一个正确的退出代码,但它不会向stdout发送任何字符.

相关文章

/etc/sysctl.conf这个目录主要是配置一些系统信息,/etc/sys...
1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起...
它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅...
不管是我们在安装软件还是监测软件的使用性能,我们都要随时...
装好Tomcat7后,发现除了本机能访问外界访问不了,岂有此理。...
修改防火墙配置需要修改 /etc/sysconfig/iptables 这个文件,...