我有一个带有BOM的UTF-8编码文件,并且想要删除BOM。是否有任何Linux命令行工具可从文件中删除BOM?
$ file test.xml
test.xml: XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines
我有一个带有BOM的UTF-8编码文件,并且想要删除BOM。是否有任何Linux命令行工具可从文件中删除BOM?
$ file test.xml
test.xml: XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines
Answers:
如果不确定文件是否包含UTF-8 BOM,则此操作(假设使用GNU实现sed
)将删除BOM(如果存在),否则将不进行任何更改。
sed '1s/^\xEF\xBB\xBF//' < orig.txt > new.txt
您还可以使用以下-i
选项覆盖现有文件:
sed -i '1s/^\xEF\xBB\xBF//' orig.txt
en_US.UTF-8
语言环境中对其进行了测试,并且可以正常工作。什么时候会失败?
-<U+FEFF>\chapter{xxx}
After:+\chapter{xxx}^M
说明:在乳胶文件中使用MS字输入错字。Linux下的Latex显示了提到的错误。输出来自git系统。我如何也可以更改表达式以适应这种特殊情况?
在UTF-8中,BOM没有意义。这些通常是由Microsoft操作系统上的虚假软件错误地添加的。
dos2unix
会删除它,并注意Windows文本文件的其他特性。
dos2unix test.xml
dos2unix
?
可以使用以下tail
命令从文件中删除BOM :
tail -c +4 withBOM.txt > withoutBOM.txt
tail
使用基于1的索引?WTF!
tail -c -1
或tail -c 1
(tail
通常用于)是从最后一个字节tail -c +1
开始,从第一个字节开始的内容。tail -c 0
/ tail -c +0
因为这样会更加不直观。
(dd bs=1 count=3 of=/dev/null; cat) <input >output
。或使用(head -c3 >/dev/null; cat)
GNU-即使在UTF8或其他非单字节语言环境中;GNU head执行'char'= byte。
您可以使用
LANG=C LC_ALL=C sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- filename
从文件的开头删除字节顺序标记(如果有的话),以及将任何CR LF换行符仅转换为LF。该LANG=C LC_ALL=C
命令告诉外壳程序您希望命令在默认C语言环境(也称为默认POSIX语言环境)中运行,在该语言环境中,构成字节顺序标记的三个字节被视为字节。在-i
对sed的选项意味着原地。如果使用-i.old
,则sed将原始文件另存为filename.old
,将新文件(如果有修改,另存为)另存为filename
。
我个人喜欢这样~/bin/fix-ms
; 例如,作为
#!/bin/dash
export LANG=C LC_ALL=C
if [ $# -gt 0 ]; then
for FILE in "$@" ; do
sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$FILE" || exit 1
done
else
exec sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//'
fi
因此,如果我需要使用它来说明所有C源文件和标头(例如,我的MS-DOS时代的旧代码!),我只需运行
find . -name '*.[CHch]' -print0 | xargs -r0 ~/bin/ms-fix
或者,如果我只想查看这样的文件,而无需修改它,则可以运行
~/bin/ms-fix < filename | less
<U+FEFF>
在我的UTF-8终端上看不到丑陋的东西。
sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"
?
sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"
不会发生;它确实返回退出代码,但是在退出之前,它会处理参数列表中列出的所有文件。
--
文件名之前的当然很重要:如果没有它,则sed可能会将以短划线开头的文件名视为选项。我将这些内容编辑成答案;谢谢你的提醒!
最近,我发现了这个小巧的命令行工具,该工具可在任意UTF-8编码文件上添加或删除BOM:UTF BOM Utils(github上的新链接)
几乎没有什么缺点,您只能下载纯C ++源代码。您必须创建makefile(例如,使用CMake)并自己进行编译,此页面上未提供二进制文件。