gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:18:32 27 4
gpt4 key购买 nike

我正在尝试编写一个脚本来自动从文件中删除 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 $?
}

出于某种原因,head 似乎忽略了文件前面的 BOM。例如,运行这个

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

不会打印任何东西。

我试着在 head --help 中寻找一个选项来解决这个问题,但没有成功。我可以做些什么来完成这项工作吗?

最佳答案

首先,让我们证明 head 确实在正常工作:

$ 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

kshzsh 也支持 $'...' 但这个构造不是 POSIX 和 dash不支持。

注意事项:

  1. 显式return $? 的使用是可选的。默认情况下,该函数将返回上次命令运行的退出代码。

  2. 我使用 POSIX 形式来定义函数。这等同于 bash 形式,但如果您必须在另一个 shell 下运行该函数,则需要处理的问题更少。

  3. bash 确实接受在函数名称中使用字符 - 但这是一个有争议的特性。我将其替换为更广泛接受的 _ 。 (有关此问题的更多信息,请参阅 this answer。)

  4. grep-q 选项使它安静,这意味着它仍然设置正确的退出代码,但它不会向 stdout 发送任何字符。

关于linux - 如何在 Bash 中检测文件是否具有 UTF-8 BOM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33977843/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com