Как использовать относительные номера строк с шаблонами в ed
Пытаясь использовать ed для удаления линий вокруг определенного шаблона, я сводил себя с ума.
Что я хотел бы сделать, это сопоставить шаблон, а затем удалить линии вокруг него.
Я пробовал несколько вариантов
ed test.txt <<<< $'/pattern/-1,+1d\nwq'
ed test.txt <<<< $'(/pattern/-1,+1)d\nwq'
ed test.txt <<<< $'/pattern/-,+1d\nwq'
ed test.txt <<<< $'(/pattern/-,+1)d\nwq'
ed test.txt <<<< $'/pattern/-,+d\nwq'
ed test.txt <<<< $'(/pattern/-,+)d\nwq'
Ни один из которых не работал. Как это сделать?
2 ответа
Я понял это после долгих проб и ошибок, хотя, похоже, не могу найти никакой документации, которая бы мне это сказала. Похоже, что каждая ссылка на строку должна быть сделана на отдельную ссылку на совпадение с образцом, и поэтому хитрость заключается в том, чтобы дать шаблон дважды.
ed test.txt <<<< $'/pattern/-,/pattern/+d\nwq'
Используя точку с запятой, ;
, установит текущую строку, .
перед обработкой второго адреса. Это делает второй адрес относительно первого, что почти то, что вы хотите:
/pattern/-;+2d
Поскольку второй адрес относится к первому, а не к шаблону, мы должны использовать +2 для адресации строк до и после шаблона.
(Обратите внимание, что /pattern/-
это сокращение для /pattern/-1
)