Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何从UTF-8文件中删除BOM表?_Linux_File_Command Line_Utf 8_Byte Order Mark - Fatal编程技术网

Linux 如何从UTF-8文件中删除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代码

我有一个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代码点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
  • 在VIM中打开文件:

     vi text.xml
    
  • 删除BOM表编码:

     :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