ZaLinux.ru

Почему при объединении строк они перекрывают друг друга

В командах и скриптах Bash вы можете использовать строки из различных файлов. К примеру, для составления команды берётся одна строка из первого файла и вторая строка из второго файла. В скрипте мы объединяем эти строки и ожидаем получить результирующую строку, включающую обе подстроки — это нормальное поведение и обычно так и происходит.

Но бывают странные ситуации, когда значение строк накладывается друг на друга и оно как бы переписывается. То есть если вторая строка длиннее первой, то мы видим только вторую. Если первая строка длиннее второй, то мы видим вторую и окончание первой.

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

Но ещё чаще такое происходит от того, что один или оба файла были созданы в текстовом редакторе Windows.

Решением является конвертация файлов с помощью утилиты dos2unix (пакет для установки называется также):

dos2unix ФАЙЛ1 ФАЙЛ2 ФАЙЛ3

dos2unix — это конвертер форматов текстовых файлов из DOS/Mac в Unix и в обратном направлении.

Пакет Dos2unix включает утилиты «dos2unix» и «unix2dos» для преобразования текстовых файлов в формате DOS или Mac в формат Unix и наоборот.

Использование программ:

dos2unix [ОПЦИИ] [ФАЙЛ ...] [-n ИСХОДНЫЙ НОВЫЙ ...]
unix2dos [ОПЦИИ] [ФАЙЛ ...] [-n ИСХОДНЫЙ НОВЫЙ ...]

По умолчанию при использовании команд будет перезаписан существующий файл. Если вы хотите изменить это поведение, то используйте опцию -n, после которой укажите сначала название старого файла, а затем название нового файла. Подстановочные символы использовать нельзя!

В текстовых файлах DOS/Windows разрыв строки, также известный как новая строка, представляет собой комбинацию двух символов: возврата каретки (CR), за которым следует перевод строки (LF). В текстовых файлах Unix разрыв строки — это один символ: перевод строки (LF). В текстовых файлах Mac до Mac OS X разрыв строки состоял из одного символа возврата каретки (CR). В настоящее время Mac OS использует разрывы строк в стиле Unix (LF).

Помимо разрывов строк, Dos2unix также может преобразовывать кодировку файлов. Некоторые кодовые страницы DOS могут быть преобразованы в Unix Latin-1. А файлы Windows Unicode (UTF-16) можно преобразовать в файлы Unix Unicode (UTF-8).

Двоичные файлы автоматически пропускаются, если преобразование не принудительно.

Необычные файлы, такие как каталоги и FIFO, автоматически пропускаются.

Символические ссылки и их цели по умолчанию остаются нетронутыми. Символические ссылки можно при желании заменить, или вывод может быть записан в цель символической ссылки. Запись в цель символической ссылки не поддерживается в Windows.

С помощью опции -i вы можете оказать информацию о файле, при этом преобразование не производится. Вы можете использовать опцию -i без флагов и тогда будет показана вся возможная информация, или можете ограничить вывод одним из аспектов.

Пример команды для показа информации о всех файлах в текущей директории:

dos2unix -i *

Следующая информация печатается в указанном порядке: количество разрывов строк DOS, количество разрывов строк Unix, количество разрывов строк Mac, метка порядка байтов, текстовая или двоичная, имя файла.

Пример вывода:

export LANG=nl               Dutch
export LANG=nl_NL            Dutch, The Netherlands
export LANG=nl_BE            Dutch, Belgium
export LANG=es_ES            Spanish, Spain
export LANG=es_MX            Spanish, Mexico
export LANG=en_US.iso88591   English, USA, Latin-1 encoding
export LANG=en_GB.UTF-8      English, UK, UTF-8 encoding

Обратите внимание, что иногда двоичный файл можно принять за текстовый файл. Смотрите также параметр "-s".

При желании можно установить дополнительные флаги для изменения вывода. Можно добавить один или несколько флагов.

Список всех опций и их описание:

man dos2unix

Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *