Меня всегда беспокоило, что sed
не имеет команды j
, например ed
.Желая, чтобы у sed был эквивалент для удобной команды j ed
This question спрашивает, как присоединиться к линиям в целом, и есть куча хороших ответов, многие из которых показывают другие инструменты, такие как awk
и perl
. И есть также некоторые решения sed
, но все они связаны с использованием команды s
, чтобы буквально отредактировать новую строку, что является решением, которое по разным причинам поражает меня как kludgey.
Теперь sed
также имеет некоторые неясные команды, имеющие отношение к пространствам «удержание» и «узор», которые я никогда не выяснял, как использовать. Я всегда предполагал - BICBW - что пространство удержания - это ответ sed на команду j
, если только я мог бы выяснить, как ее использовать.
Так что мой вопрос на сегодняшний день - и это больше на интеллигенте, как практический вопрос - это, есть хороший, безопасный, достаточно краткий способ сделать эквивалент
sed /pat/j
Это для каждой строки, содержащей шаблон pat
, присоедините его к следующей строке (то есть, как и ed
, если бы я использовал g/pat/j/
).
Как я уже сказал, это интеллектуальный вопрос. Я знаю, как присоединяться к линиям, используя другие инструменты, или используя sed
и команду s
на цитируемой литеральной новой строке. Но мне кажется, что это должен быть лучший способ.
(Или, может быть, я должен просто перехватить копию sed.c
и взломать в надлежащем j
команды.)
Aha! Поэтому, если я правильно понимаю это, 'N' почти похоже на' j', за исключением того, что он вставляет новую строку. Очень интересно.(Ваш пример не работал для меня напрямую, мне пришлось использовать 'sed -e '/ pat/N' -e '/ \ n//' '. В вашем примере хранится жалоба« bad flag in substitute command:'} «Не знаю, если это ограничение с моей версией sed или что.) –
Он использует не переносные конструкции, поэтому поведение в разных seds будет отличаться. Таким образом, решение в вашем комментарии и также будет вести себя по-разному в разных садах. –
@SteveSummit Он использует GNU 'sed', который не требует новых строк после каждой команды. Удобен для «однострочных». – Kusalananda