Как использовать относительные номера строк с шаблонами в 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)

Другие вопросы по тегам