Linux 如何使用sed在现有文件的开头添加UTF-16字符?

Linux 如何使用sed在现有文件的开头添加UTF-16字符?,linux,shell,sed,Linux,Shell,Sed,我有一个大的脚本,生成了许多文件,但由于缺少BOM表,部分脚本无法工作。我必须处理名为pagecounts-${u date}的文件,该文件最终是这样创建的: cat $TMPDIR/*.filtered > $TMPDIR/pagecounts-${_date} cat $TMPDIR/*.filtered > $TMPDIR/tmp_pagecounts-${_date} echo '\ufeff' > $TMPDIR/pagecounts-${_date} cat $T

我有一个大的脚本,生成了许多文件,但由于缺少BOM表,部分脚本无法工作。我必须处理名为pagecounts-${u date}的文件,该文件最终是这样创建的:

cat $TMPDIR/*.filtered > $TMPDIR/pagecounts-${_date}
cat $TMPDIR/*.filtered > $TMPDIR/tmp_pagecounts-${_date}
echo '\ufeff' > $TMPDIR/pagecounts-${_date}
cat $TMPDIR/tmp_pagecounts-${_date} | sort >> $TMPDIR/pagecounts-${_date}
然后,我使用sort并尝试在另一个脚本中使用它,但是我得到了BOM错误。我的问题是,我可以在已经存在的文件的开头添加utf-16的BOM表吗?如果是,我如何才能做到这一点

我正在考虑使用这样一个临时文件:

cat $TMPDIR/*.filtered > $TMPDIR/pagecounts-${_date}
cat $TMPDIR/*.filtered > $TMPDIR/tmp_pagecounts-${_date}
echo '\ufeff' > $TMPDIR/pagecounts-${_date}
cat $TMPDIR/tmp_pagecounts-${_date} | sort >> $TMPDIR/pagecounts-${_date}

但这种方法似乎可以切掉一些UTF-16字符。

您可以使用
echo-e
按原样打印Unicode
UTF-16
字符序列

sed "1s/^/$(echo -ne '\ufeff')/" "$TMPDIR"/pagecounts-${_date}
或者也使用
printf

sed "1s/^/$(printf '\ufeff')/" "$TMPDIR"/pagecounts-${_date}
在同一文件上执行
hextump-c
hextump-c
后,确认相同的顺序是准确的

echo -ne '\ufeff' | hexdump -c
0000000 355 237 277 355 273 277
0000006
您也可以在应用于文件时确认这些字节是一致的

上述
sed
命令只需将文件内容打印到标准输出,使用
-i
标志修改文件(macOS的
sed
需要
-i'


您突然将
sort
引入了处理添加BOM(并在过程中获胜)的问题中。如果
sort
切掉UTF-16字符,这与缺少的BOM完全不同。此外,UTF-16本身非常可疑。哪种Unix程序使用UTF-16编写文件?你在UTF-16地区吗?