Это общая особенность sed
sed '/^\/\/test$/,/^\/\/endtest/d'
Поскольку /
используется для привязки регулярных выражений, их необходимо экранировать в регулярном выражении.
Если вы хотите сохранитьотметки (согласно запросу):
sed '/^\/\/test$/,/^\/\/endtest/{//!d}'
Объяснение:
Посмотрите на info sed
, найдите sed address
-> Regexp Addresses
и Range Addresses
.
Заключено в { ... }
, символ //
означает любую границу.
Пустое регулярное выражение '//'повторяет последнее совпадение регулярного выражения (то же самое сохраняется, если пустое регулярное выражение передается команде' s ').
!
означает not
, затемd
для delete line
Альтернатива: Вы можете написать:
sed '/^\/\/\(end\)\?test$/,//{//!d}'
или
sed -E '/^\/\/(end)?test$/,//{//!d}'
Будет работать так же, но все равно, это может изменить эффект, если может существовать какой-то дополнительный шаблон //endtest
до первого открытого шаблона (//test
).
... Все это было сделано,используя GNU sed
4.4 !
Под MacOS, BSD sed
В MacOS я успешно отбросил нужные строки с этим синтаксисом:
sed '/^\/\/test$/,/^\/\/endtest/{/^\/\/\(end\)\{0,1\}test$/!d;}'
или
sed -E '/^\/\/test$/,/^\/\/endtest/{/^\/\/(end)?test$/!d;}'