Как удалить несколько строк за вхождение в файле?

10

Скажем, у меня есть файл строки 857835, содержащий такие вещи:

a1
rubbish1
rubbish2
rubbish3
rubbish4
a1
rubbish5
rubbish6
rubbish7
rubbish8

И я хочу удалить все вхождения a1и следующую строку ( rubbish1и rubbish5в этом примере). Как это сделать?

Я пытался grep 'a1' -v -A1безрезультатно, и мои навыки sed не очень хороши:}

Мой Google-фу не смог мне помочь на этот раз, кто-то, пожалуйста, помогите!

rayfoo
источник

Ответы:

15

Пытаться:

sed -e '/^a1$/,+1d' "filename"

Это означает от / ^ a1 $ / до следующей строки, удалить

^ И $ гарантируют, что вы соответствуете всей строке, поэтому скрытый a1 не будет найден.

asoundmove
источник
6
Возможно, вы захотите ^и $в этом совпадении заставить совпадать целые строки.
Jander
@Jander: Конечно, исправлено
asoundmove
12

Следующее будет работать на не-GNU sed( ,+1адресный синтаксис является расширением GNU):

sed -e '/^a1$/,/^/d' my_file >my_filtered_file

«Начиная со строки, которая в точности читает« a1 », и заканчивая следующей строкой, для которой существует начало строки (т. Е. Следующей строкой), удалите.»

Это гораздо менее расширяемо, чем ответ @ asoundmove, так как удаление другого числа строк потребует совершенно другого сценария.

Jander
источник