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

标签 linux shell sed

我有一个生成许多文件的大型脚本,由于缺少 BOM,其中一部分无法运行。我必须使用名为 pagecounts-${_date} 的文件,它最终是这样创建的:

cat $TMPDIR/*.filtered > $TMPDIR/pagecounts-${_date}

然后,我使用排序并尝试在另一个脚本中使用它,但我收到 BOM 错误。我的问题是,我可以在现有文件的开头添加 utf-16 的 BOM 吗?如果是,我该如何实现?

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

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}

在同一文件上执行hexdump -chexdump -C 后,确认相同的序列是准确的

echo -ne '\ufeff' | hexdump -c
0000000 355 237 277 355 273 277
0000006

您也可以确认这些字节在应用到文件时是一致的。

上面的 sed 命令只是将文件内容打印到标准输出,要就地修改文件,请使用 -i 标志(-i '' 是 macOS 的 sed 所必需的)

sed -i '' ...

关于linux - 如何使用 sed 在现有文件的开头添加 UTF-16 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49346675/

相关文章:

linux - Shell 脚本在 Linux 中执行时显示错误

linux - 使用 openssl 构建根工具链

linux - DSN : Service unavailable sendmail linux

python - 直到文件末尾才能让 Python 读取

bash - 修改引号内的内容,BASH

sed合并由空行分隔的N个文本行?

regex - Sed正则表达式和子字符串取反

c++ - 在不同环境中正确使用 C 虚拟函数替换

bash - 在shell脚本中获取进程的返回值

linux - 如何将时间戳添加到 bash 命令的结果中,以便记录到文件和屏幕