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

时间:2015-07-10 09:22:14

标签: macos perl utf-8 batch-processing utf-16le

我找到了一个非常有用的perl here,它将文本文件的文件名写入文件的第一行。我在OS X Yosemite的终端上运行它:

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

经过一些修改,我认为它已经解决了我的具体问题,但是我收到的文件是UTF-16LE,而且我发现这个命令是用UTF-8编写的,并且真正搞乱了输出(文本明显正确但在excel,filemaker等的计算中无法识别)。

经过多次尝试,我需要帮助才能让这个脚本将UTF-16LE中的文件名写入文件的开头。 (注意:我现在有一个解决方法,批量转换文件到UTF-8,然后运行它,但我更喜欢一步完成这个工作流程。)

1 个答案:

答案 0 :(得分:1)

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的混合包,因为最后一个版本在新标题和数据之间创建了一组混合字符。感谢reinierpost指导我正确的方向。如果其他人可以改善这一点,我仍然感兴趣。