Насколько переносимо использовать полуколоны в качестве разделителей команд в sed?
В sed довольно распространено использование нескольких команд, разделенных полуколониями:
$ sed -e '/re/{s//replace/p; q;}
Однако стандарт (например, http://pubs.opengroup.org/onlinepubs/9699919799/) позволяет
newlines как разделитель:
$ sed -e '/re/{
s//replace/p
q
}
Есть ли много распространенных реализаций sed, которые все еще используются, которые не позволяют использовать двоеточие? IOW, может ли sed script быть переносным использовать полуколоны?
Ответы
Ответ 1
Из спецификация POSIX sed
:
Команды, отличные от {, a, b, c, i, r, t, w, : и #. a <semicolon>
, необязательные символы <blank>
и еще один командный глагол. Однако, когда глагол команды s используется с флагом w, после этого с помощью другой команды таким образом создаются результаты undefined.
Таким образом, большинство команд, помимо упомянутых выше, могут быть разделены точкой с запятой.
/[^\{abcirtw:#];[[:space:]]*/
: -)
Ответ 2
Tricky one... Только ссылка, которую я могу найти об этом, находится в sed-faq chapter 6.8.1
Большинство версий sed позволяют выдавать несколько команд на командной строки, разделенной точкой с запятой (;).
Единственная ссылка на ;
не работает для HHSED
, см. Глава 7
Ответ 3
GNU sed
, кажется, позволяет полуколонам в нескольких местах, что MacOS X (BSD) sed
не поддерживает. Теперь у меня нет деталей на кончиках пальцев, но несколько раз мне приходилось модифицировать ответы, чтобы заставить их нормально работать на Mac. Возможно, проблема связана с командами, заключенными в скобки.