OSX perl 以 UTF-16LE 批量写入文件名作为 txt 文件的第一行

OSX perl to batch write filename as first line in txt file in UTF-16LE

我发现了一个非常有用的 perl here,它将文本文件的文件名写入文件的第一行。我正在从 OS X Yosemite:

中的终端 运行ning
perl -i -pe 'BEGIN{undef $/;} s/^/\nFilename:$ARGV\n/' `find . -name '*.TXT'`

经过一些修改,我认为它已经解决了我的具体问题,但是我正在获取的文件是 UTF-16LE,后来我发现这个命令是用 UTF-8 编写的,并使输出变得一团糟(文本明显正确,但在 excel、filemaker 等的计算中无法识别)。

经过几次尝试后,我需要帮助来让这个脚本将 UTF-16LE 格式的文件名写入文件的开头。 (注意:我现在确实有一个解决方法,可以将文件批量转换为 UTF-8,然后 运行 但是我更希望一步完成这个工作流程)。

reinierpost 是正确的 - 它更多的是关于删除原始的 unicode 字节顺序标记 (BOM)。最终起作用的是:

perl -i -pe 'BEGIN{undef $/;} s/\xFF\xFE/Filename:$ARGV\n/' `find . -name '*.TXT'`

其中 UTF-16LE BOM \xFF\xFE 已替换为我的新字符串。作为参考,其他一些 BOM 是: - iso-10646-1 > \xFE\xFF - UTF-16BE > \xFE\xFF - UTF-8 > \xEF\xBB\xBF

我还能够使用

将新文本写入 UTF-16LE
perl -i -pe 'BEGIN{binmode STDIN,":encoding(utf8)";binmode STDOUT,":encoding(utf16)"; undef $/;} s/\xFF\xFE/\xFF\xFE\nFilename:$ARGV\n/' `find . -name '*.TXT'`

但是我现在相信我的源数据是 UTF8 和 UTF16 的混合包,因为最后一个版本在新 header 和数据之间创建了一组混合字符。感谢 reinierpost 引导我朝着正确的方向前进。如果其他人可以改进这一点,我仍然感兴趣。