Различия в командах sed в поведении каждой ОС и ее последствия - PullRequest
2 голосов
/ 06 ноября 2011

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

Теперь давайте рассмотрим справочные страницы sed SUSE Linux и HP (IA64).


SUSE Linux:

ОПИСАНИЕ Sed - это потоковый редактор. Потоковый редактор используется для выполнения основного текста преобразования на входном потоке (файл или вход из конвейера). Хотя в некотором роде похож на редактор, который разрешает редактирование по сценарию (например, ed), sed работает, выполняя только один проход по входным данным, и следовательно, более эффективно. Но это способность sed фильтровать текст в трубопроводе, который особенно отличает его от других типов редактора.


HP IA64:

ОПИСАНИЕ sed копирует именованные текстовые файлы (стандартный ввод по умолчанию) в стандартный вывод, редактируемый в соответствии со сценарием, содержащим до 100 команд. Только полные строки ввода обрабатываются. Любой вводимый текст в конце файла, который не заканчивается символом новой строки, игнорируется

Подсвеченный текст, похоже, является основным отличием в рабочем поведении. Таким образом, все мои сценарии начали сбой в машине HP-UX IA64 во время портирования.

Вопрос:
а. Нет ли какого-либо базового стандарта, который заставляет каждого поставщика иметь базовое соответствие с реализацией?

б. Если есть какие-то команды, которые подтверждают, и другие, которые не могут подтвердить, кто-нибудь может опубликовать список, который придерживается стандартов.

с. Сейчас у меня много таких команд, которые используются как часть сценариев моего проекта. Каков наилучший способ проверить / избежать такого рода ошибок - кроме тестирования каждой команды для всех сценариев?

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

1 Ответ

3 голосов
/ 07 ноября 2011

С точки зрения POSIX, нет ничего плохого в поведении HP-UX по игнорированию текста после последней новой строки. Ключ в требовании к приложению, чтобы входные файлы sed были текстовыми файлами. Это означает, что не может быть никаких байтов NUL, длина строки ограничена {LINE_MAX} (включая символ новой строки), и файл должен заканчиваться символом новой строки, если он не пустой (поскольку строка должна заканчиваться символом новой строки). Если приложение вызывает sed с входным файлом, который не является текстовым файлом, поведение не определено.

Другие распространенные варианты поведения в этой ситуации включают запуск сценария с «строкой», которая не заканчивается новой строкой (GNU sed), и добавление окончательной новой строки, если она отсутствует (FreeBSD sed).

Ограничение в 100 команд кажется более сомнительным; Я не вижу предложения, допускающего такой предел.

Ссылки POSIX.1-2008: строка XBD 3.205, текстовый файл XBD 3.394, утилиты XCU 4 Utilities sed.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...