воскресенье, 8 апреля 2012 г.

Конвертирование текстовых файлов из формата Unix в формат Windows


Отличия между текстовыми файлами формата Windows и Unix незначительны. В Windows, признаком конца строки является два ASCII символа -  возврат каретки (CR) и переход на новую строку (LF), в Unix используется только LF. Последствия этого выражаются в том, что некоторые Windows приложения не могут показать перехода на новую строку в файлах Unix  формата. Аналогично Unix программы могут показывать CR в  файлах Windows формата как символ Ctrl-m (^M) в конце каждой стоки.

Далее предложено несколько решений данной проблемы. Этот пост содержит инструкции по тому как используя FTP, unix2dos и dos2unix, tr, awk, Perl, vi и vim произвести превращение одного формата файла в другой. Все эти утилиты уже присутствуют на любом Unix компьютере.
Замечание: в примерах приведенных ниже имя файла unixfile.txt будет соответствовать Unix формату текстового файла, winfile.txt соответственно для формата M$ Windows.

FTP
При использовании программы FTP для перемещения текстовых файлов между Unix и Windows системами, файлы должны быть передаваемы в формате ASCII, таким образом документ преобразуется в текстовый формат хоста. Некоторые FTP клиенты, особенно с графическим интерфейсом, выполняют преобразование автоматически. Если Вы используете FTP клиент из командной строки, то перед перемещением файлов введите:

ascii


dos2unix и unix2dos
В ОС Solaris утилиты dos2unix и unix2dos уже присутствуют и ими уже можно воспользоваться для конвертирования из командной стоки.
Для конвертирования Windows файла в Unix файл, введите:

dos2unix winfile.txt unixfile.txt

Для обратного конвертирования Unix файла в Windows файл:

unix2dos unixfile.txt winfile.txt


Замечание: эти утилиты не входят в штатную поставку Debian'а, поэтому:
apt-get install  unix2dos dos2unix


tr
Вы можете использовать tr для удаления всех символов CR и Ctrl-z ( ^Z ) из Windows файла:

tr -d '\15\32' < winfile.txt > unixfile.txt

Но, нельзя использовать tr для конвертирования Unix форматов в Windows.

awk
Windows --> Unix:

awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt

Unix --> Windows:

awk 'sub("$", "\r")' unixfile.txt > winfile.txt

Старые версии awk не поддерживали функции sub. Для выхода из этой ситуации замените awk на gawk или nawk.

Perl
Windows --> Unix:

perl -p -e 's/\r$//' < winfile.txt > unixfile.txt

Unix --> Windows:

perl -p -e 's/\n/\r\n/' < unixfile.txt > winfile.txt

Должны использоваться только одинарные кавычки в каждой командной строке. Это мера предотвращения попыток команды выполнить инструкции внутри себя.

vi
В vi для удаления символа CR выполним следующую команду:

:1,$s/^M//g

Замечание: для ввода символа ^M нажмите Ctrl-v.

Vim

:set ff=unix  для конвертирования в формат Unix;
:set ff=dos для конвертирования в формат Windows.

Заимствовано из http://kb.iu.edu/data/acux.html