Толик Панков
hex_laden
............ .................. ................

October 2030
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

Толик Панков [userpic]
Универсальный конвертер символов перевода строки (Windows\Mac\Linux)

Ух и задолбался же я с этими самыми переводами строк! Возникла тут задачка конвертировать кучу огромную текстовых файлов из DOS/Windows (перенос строки CR+LF, h0D, h0A), старого Mac-формата (CR, h0D), который, вопреки утверждениям Википедии и других авторитетных источников использует не только вышедшие из употребления Маки, в формат Linux (LF, h0A). Желательно иметь возможность еще и обратной/произвольной конвертации между всем этим зоопарком. Сначала я, конечно, попробовал написать универсальный скрипт с помощью sed, но никакой универсальности не получилось. На C++, ой, после C# это все равно, что пересесть с мерседеса на велосипед. На C# задача в строчки 4 кода решается, но тащить ради маленькой утилиты Mono, это уж слишком

В общем нашел готовую крохотную утилиту flip.
Плюсы:
+ Есть готовые версии почти под все платформы, кроме DOS, даже статически откомпилированный бинарник для Linux, так что можно задуть в роутер/initrd, если оно кому-то там надо.
+ Бесплатно
+ Есть исходники
+ Работает моментально
+ Поддерживает файлы с перепутанными концами строк (где есть и Windows, и UNIX и Mac варианты)

Минусов пока не нашел.
Использование простое: первый параметр, что конкретно делаем, остальные - имена файлов через пробел.
Делать можно следующее:
-t - отобразить используемый тип переноса строки
-d - конвертировать в DOS/Windows формат (CR+LF)
-m - конвертировать в Mac-формат (CR)
-u - конвертировать в UNIX/Linux формат (LF)

Скачать можно со странички автора или отсюда:
1. Исходник
2. Slackware-пакет
3. Версия для Windows (консольная)
4. Все остальное

Это репост заметки из моего блога на сайте http://tolik-punkoff.com
Оригинал заметки находится здесь: http://tolik-punkoff.com/2017/01/09/universalnyj-konverter-simvolov-perevoda-stroki-windows-mac-linux/

Tags: , ,
Comments

> На C# задача в строчки 4 кода решается, но тащить ради маленькой утилиты Mono, это уж слишком

Ад какой. На sed / awk / perl это в одну строчку.

Напишите, как на sed (или на sed+awk), я себе весь мозг съел, пытаясь все три случая в одну кучу собрать и как-то универсализировать скрипт, а вот perl не желателен вообще, ибо может использоваться там, где того перла нема. Вообще про C# я, конечно, загнул :) И mono тащить не собирался. Идеально было бы чтоб либо средствами того, что есть в bisybox'е (а sed, awk и tr там вроде есть) либо отдельной утилитой. Найденная утилитка как раз и убила всех зайцев сразу, и статический бинарник есть, можно хоть в утюг встроить, да еще и в смешанных случаях работать может, когда разные концы строк в одном файле встречаются.
Но за решение на sed+awk буду благодарен.

Зачем писать один скрипт на три случая? Его всё равно придется вызывать с разными параметрами, проще поменять пару букв в однострочной команде с sed/awk.

Кроме того, есть программы dos2unix и unix2dos.

Его всё равно придется вызывать с разными параметрами
Да и ладно, зато универсально - один раз написал и пользуешься.
Насчет sed, кстати, вообще не понял, что я не так делал, он почему-то не принимал у меня ни восьмеричные, ни шестнадцатеричные коды, ни последовательности \r \n \r\n.
Да в принципе уже все, нашел же что устраивает, оставьте, не заморачивайтесь :)

Кроме того, есть программы dos2unix и unix2dos
Знаю, тоже вариант, но не под мой случай.

Первым делом это и сделал, и делал неоднократно. Прям до посинения. Какую-нибудь мелкую фигню пролюбил которую не знаю, или внимания не обратил, вот и не работает.
Да и черт с ним, решено уже.
А вот tr прекрасно все принимает CR на LF (и обратно) меняются одной строкой.