2015-07-30 4 views
1

У меня есть файл с кодировкой UTF-16, и я хочу, чтобы строки UNIX заканчивались концами строк Windows. Я не хочу ничего трогать.LF -> CR/LF преобразование для файла UTF-16

Есть ли инструмент командной строки linux, который может искать два байта «0A 00» и заменить его четырьмя байтами «0D 00 0A 00»?

+0

Я попытался "Unix2Dos" уже. Он не работает, поскольку он заменяет «0A 00» на «OD 0A 00»! –

ответ

1

Perl на помощь:

perl -we 'binmode STDIN, ":encoding(UTF-16le)"; 
      binmode STDOUT, ":encoding(UTF-16le):crlf"; 
      print while <STDIN>; 
     ' <input.txt> output.txt 
+0

К сожалению, это не работает для меня. Но мой коллега только что нашел это: perl -pe "BEGIN {binmode $ _, ': raw: encoding (UTF-16LE)' для * STDIN, * STDOUT}; s/\ n \ 0/\ r \ 0 \ n \ 0/г;» < input > output –

+0

@LarsSchneider: Помогает ли предварительная обработка ': raw' в binmodes? Но оригинал работает для меня, вы можете показать, что возвращает 'xxd input.txt'? – choroba

+0

Нравится? 'perl -we': raw: binmode STDIN, ": encoding (UTF-16le)"; : raw: binmode STDOUT, ": encoding (UTF-16le): crlf"; печатать в то время как <>; ''? –

0

unix2dos - это то, что вы ищете. Посмотрите его различные варианты, чтобы найти тот, который подходит для вашей кодировки UTF-16.

0

Вы можете использовать unix2dos, но перед этим необходимо преобразовать файл в 8-разрядную кодировку и вернуться к UTF-16 после. Очевидным промежуточный кандидат UTF-8:

$ cat in.txt | iconv -f UTF-16 -t UTF-8 | unix2dos | iconv -f UTF-8 -t UTF-16 > out.txt 

Вы можете обернуть эти три команды по конвейеру в удобном сценарии, если вы хотите.

#/bin/sh 
iconv -f UTF-16 -t UTF-8 | unix2dos | iconv -f UTF-8 -t UTF-16