m13*_*13r 113 command-line unicode files
我有一个带有 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
Run Code Online (Sandbox Code Playgroud)
CSM*_*CSM 120
如果您不确定文件是否包含 UTF-8 BOM,那么这(假设 GNU 实现sed)将删除 BOM(如果它存在),或者如果它不存在则不进行任何更改。
sed '1s/^\xEF\xBB\xBF//' < orig.txt > new.txt
Run Code Online (Sandbox Code Playgroud)
您还可以使用以下-i选项覆盖现有文件:
sed -i '1s/^\xEF\xBB\xBF//' orig.txt
Run Code Online (Sandbox Code Playgroud)
如果您使用的是 BSD 版本sed(例如 macOS),那么您需要让 bash 进行转义:
sed $'1s/\xef\xbb\xbf//' < orig.txt > new.txt
Run Code Online (Sandbox Code Playgroud)
Sté*_*las 102
BOM 在 UTF-8 中没有意义。这些通常是由 Microsoft 操作系统上的虚假软件错误添加的。
dos2unix 将删除它并处理 Windows 文本文件的其他特性。
dos2unix test.xml
Run Code Online (Sandbox Code Playgroud)
Jos*_*ter 61
在 VIM 中打开文件:
vi text.xml
Run Code Online (Sandbox Code Playgroud)
删除 BOM 编码:
:set nobomb
Run Code Online (Sandbox Code Playgroud)
保存并退出:
:wq
Run Code Online (Sandbox Code Playgroud)
对于非交互式解决方案,请尝试以下命令行:
vi text.xml
Run Code Online (Sandbox Code Playgroud)
这应该删除 BOM,保存文件并退出,所有这些都来自命令行。
m13*_*13r 33
可以使用以下tail命令从文件中删除 BOM :
tail -c +4 withBOM.txt > withoutBOM.txt
Run Code Online (Sandbox Code Playgroud)
您可以使用
LANG=C LC_ALL=C sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- filename
Run Code Online (Sandbox Code Playgroud)
从文件开头删除字节顺序标记(如果有),并将任何 CR LF 换行符仅转换为 LF。该LANG=C LC_ALL=C告诉你希望命令在默认的C语言环境(也被称为默认POSIX环境),其中,形成字节顺序标记的三个字节被视为字节运行shell。该-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
Run Code Online (Sandbox Code Playgroud)
因此,如果我需要将其应用于所有 C 源文件和头文件(例如,我在 MS-DOS 时代的旧代码!),我只需运行
find . -name '*.[CHch]' -print0 | xargs -r0 ~/bin/ms-fix
Run Code Online (Sandbox Code Playgroud)
或者,如果我只是想看这样一个文件,不修改它,我可以运行
~/bin/ms-fix < filename | less
Run Code Online (Sandbox Code Playgroud)
<U+FEFF>在我的 UTF-8 终端中看不到丑陋的一面。
小智 7
为此,我经常使用 vim one-liner:
vim --clean -c 'se nobomb|wq' filename
vim --clean -c 'bufdo se nobomb|wqa' filename1 filename2 ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
136613 次 |
| 最近记录: |