Sed для удаления диапазона строк из определенной строки соответствия ДО ТОЛЬКО определенной строки соответствия (не включая последнюю строку) - PullRequest
11 голосов
/ 16 марта 2012

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

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

Теперь я хотел бы указать диапазон, для которого 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 должны быть удалены.

Спасибо!

Ответы [ 3 ]

13 голосов
/ 16 марта 2012

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

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

#output
line 1
blah blah 1
line 2
line 3

Sed deconstructed:

 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, чтобы освоиться.

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

1 голос
/ 16 марта 2012

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

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
0 голосов
/ 16 марта 2012
$ 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
...