Интересно, могут ли реализации «sed» в GNU и BusyBox быть сломаны?
Моя реализация sed по умолчанию - из GNU.
POSIX говорит:
Команда редактирования с двумя адресами должна выбрать включающий диапазон из первого пространства шаблона, которое соответствует первому адресу, через следующее пространство шаблона, которое соответствует второму.
Но тогда почему задается
$ { echo ha; echo ha; echo ha; } | sed '0,/ha/ !d'
ha
вместо
ha
ha
?Очевидно, что второе «ха» здесь - это следующее «шаблонное» пространство, которое совпадает, поэтому оно также должно быть выведено!
Но, что еще более странно,
$ { echo ha; echo ha; echo ha; } | busybox sed '0,/ha/ !d'
ничего не выводит приall!
Но даже если sed будет делать то, что говорит определение POSIX, все еще неясно, что должно произойти, когда выражение диапазона фактически проверяется.
Имеет ли каждое условие диапазона свое внутреннее условие?государство?Или существует единственное глобальное состояние для всех условий диапазона в сценарии sed?
Очевидно, что условие диапазона должно по крайней мере помнить, находится ли оно в данный момент в «поиске совпадения первого адреса» -состояние или в «поиск совпадения второго адреса» -состояния.Возможно, ему даже нужно запомнить третье состояние: «Я уже обработал диапазон и больше не буду совпадать, несмотря ни на что».
Конечно, имеет значение, когда обновляются эти условия: каждый раз, когда читается новое пространство шаблона?Каждый раз, когда пространство шаблона изменяется, скажем, с помощью s-команды?Или просто, если поток управления достигает условия диапазона?
Итак, что это?
Пока я не узнаю лучше, я буду избегать условий диапазона в моих sed-скриптах и буду считать ихсомнительная особенность.