Linux 如何从UTF-8文件中删除BOM表?
我有一个UTF-8编码的BOM文件,想删除BOM。有没有linux命令行工具可以从文件中删除BOM表Linux 如何从UTF-8文件中删除BOM表?,linux,file,command-line,utf-8,byte-order-mark,Linux,File,Command Line,Utf 8,Byte Order Mark,我有一个UTF-8编码的BOM文件,想删除BOM。有没有linux命令行工具可以从文件中删除BOM表 $ file test.xml test.xml: XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines 如果确定给定文件以BOM表开头,则可以使用tail命令从文件中删除BOM表: tail --bytes=+4 withBOM.txt > withoutBOM.txt BOM是Unicode代码
$ file test.xml
test.xml: XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines
如果确定给定文件以BOM表开头,则可以使用
tail
命令从文件中删除BOM表:
tail --bytes=+4 withBOM.txt > withoutBOM.txt
BOM是Unicode代码点U+FEFF;UTF-8编码由三个十六进制值0xEF、0xBB、0xBF组成 使用bash,您可以使用
$'
特殊报价表单创建UTF-8 BOM,该表单实现Unicode转义:$'\uFEFF'
。因此,使用bash,从文本文件开头删除UTF-8 BOM的可靠方法是:
sed -i $'1s/^\uFEFF//' file.txt
如果文件不是以UTF-8 BOM表开头,则该文件将保持不变,否则将删除BOM表
如果您正在使用其他shell,您可能会发现“$(printf'\ufeff')”
生成BOM字符(该字符与zsh
以及任何没有printf
内置的shell一起工作,前提是/usr/bin/printf
是Gnu版本),但如果您想要与Posix兼容的版本,您可以使用:
sed "$(printf '1s/^\357\273\277//)" file.txt
(-i
就地编辑标志也是Gnu扩展;此版本将可能修改的文件写入标准输出。)使用VIM
vi text.xml
:set nobomb
:wq
对于非交互式解决方案,请尝试以下命令行:
vi-c:set nobomb“-c”:wq“text.xml
这将从命令行中删除BOM表、保存文件并退出。好吧,今天刚刚解决了这个问题,我首选的方法是dos2unix: dos2unix将删除BOM,并处理来自其他SOs的其他特性:
$ sudo apt install dos2unix
$ dos2unix test.xml
也可以仅删除BOM(-r,--删除BOM):
注意:使用dos2unix 7.3.4测试Joshua Pinter的答案在mac上正确运行,因此我编写了一个脚本,从给定文件夹中的所有文件中删除BOM,请参阅 它可以按如下方式使用: 从当前目录中的所有文件中删除BOM:
rmbom。
打印当前目录中包含BOM的所有文件:rmbom-a
仅从当前目录中扩展名为txt或cs:
rmbom的所有文件中删除BOM-e txt-e cs
只有当您知道文件以UTF-8编码的BOM开头时,才应执行此操作。作为一般建议,这不是一个好主意,因为如果文件不是以BOM开头的,或者如果文件是UTF-16(或任何其他编码),这将破坏数据的前几个有意义的字符。有没有办法让vim以非交互方式完成这项工作?OP要求提供“命令行”解决方案。@DoktorJ如果您发现了,请务必在这里为其他人发表评论。这对我根本不起作用,因为vim预期的编码是错误的。修复方法如下:(可能只需要设置文件编码,但我在.vimrc中同时设置了这两种编码)@DoktorJ尝试在vi
中使用-c
标志,比如:vi-c:set nobomb“-c”:wq“text.xml
。这将删除BOM表、保存文件并从命令行中全部退出。跨站点重复,同一作者:SuSE用户报告其版本的dos2unix
不执行此操作。不确定版本号可能是什么,或者它们是否来自同一个源。
$ dos2unix -r test.xml