Насколько переносимо использование точек с запятой в качестве разделителей команд в sed? - PullRequest
12 голосов
/ 08 июня 2011

В sed достаточно часто использовать несколько команд, разделенных точками с запятой:

$ sed -e '/re/{s//replace/p; q;}

Однако стандарт (например, http://pubs.opengroup.org/onlinepubs/9699919799/) допускает только переводы строк в качестве разделителя:

$ sed -e '/re/{
    s//replace/p
    q
}

Много ли еще распространенных реализаций sed, которые не позволяют использовать точку с запятой?Итак, может ли сценарий sed, предназначенный для переноса, использовать точки с запятой?

Ответы [ 3 ]

5 голосов
/ 25 декабря 2013

С спецификацией POSIX sed :

Глаголы команд, отличные от {, a , b , c , i , r , t , w , : и # могут сопровождаться <semicolon>, необязательными <blank> символами и другим командным глаголом.Однако, когда командный глагол s используется с флагом w , выполнение этой команды другой командой приводит к неопределенным результатам.

Так что большинство командкроме упомянутых выше, может быть разделен точкой с запятой.

/[^\{abcirtw:#];[[:space:]]*/: -)

3 голосов
/ 09 июня 2011

Tricky one ... Единственная ссылка, которую я смог найти по этому поводу, находится в главе sed-faq 6.8.1

Большинство версий sed разрешают запуск нескольких команд вкомандная строка, разделенная точкой с запятой (;).

Единственная ссылка на ; не работает - для HHSED, см. Глава 7

1 голос
/ 09 июня 2011

GNU sed, по-видимому, допускает использование точек с запятой в некоторых местах, чего не позволяет MacOS X (BSD) sed. Сейчас у меня нет подробностей, но несколько раз мне приходилось изменять ответы, чтобы они правильно работали на Mac. Возможно, проблема заключалась в заключенных в скобки последовательностях команд.

...