Sed для удаления диапазона строк из определенной строки соответствия. До конкретной строки соответствия (не включая последнюю строку)

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

Моя проблема заключается в следующем: мне нужно избавиться от мусорных линий, которые группируются по всему файлу, но находятся между кластерами используемых строк. Я искал руководство sed и другие информационные источники об удалении диапазонов, соответствующих шаблонам, но они упоминаются только для удаления шаблона соответствия UNTIL, а не TILL.

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

Например:

line 1
blah blah 1
blah blah 2
blah blah 3
blah blah 4
line 2
line 3

Результат должен быть:

line 1
blah blah 1
line 2
line 3

Обратите внимание на несколько строк между строкой и строкой 2. В то время как бла-бла-1 должен остаться, остальные 3 необходимо удалить.

Спасибо!

Ответ 1

Попробуйте это

sed -n '/line 1/{;p;n;p;};/line 2/,$p'  sedTest1.txt

#output
line 1
blah blah 1
line 2
line 3

Сед деконструирован:

 sed -n '/line 1/{;p;n;p;};/line 2/,$p'  sedTest1.txt
     |    |        |        |      |||-> print the range
     |    |        |        |      ||-> til end of file (the '$' char)
     |    |        |        |      |-> range operator (i.e. start,end)
     |    |        |        |-> beginning of range to watch for and print
     |    |        |-> now print line, get 'n'ext, print that line 
     |    |-> match the line with text 'line 1'
     |-> don't print every line, only ones flagged with 'p'

Прочитайте это снизу вверх.

Кроме того, поскольку ваши данные являются образцом, и вы называете это мусорными линиями, это может быть не так просто. Вам нужно будет изучить sed-учебники, чтобы ускориться.

Надеюсь, это поможет.

Ответ 2

Это может сработать для вас:

sed '/line 1/,/line 2/{//!d;/line 1/N}' file
line 1
blah blah 1
line 2
line 3

или это (если диапазоны не последовательны):

sed '/line 1/,/line 2/{//!d;$!N}' file
line 1
blah blah 1
line 2
line 3

Ответ 3

$ sed -n '/line 1/{p;n;p;:a;n;/line 2/{:c;p;n;bc};ba};p' input.txt
line 1
blah blah 1
line 2
line 3