Як видалити кілька рядків за кожне виникнення у файлі?


11

Скажіть, у мене є файл цього рядка 857835, який містить такі речі:

a1
rubbish1
rubbish2
rubbish3
rubbish4
a1
rubbish5
rubbish6
rubbish7
rubbish8

І я хочу видалити всі виникнення a1та наступний рядок ( rubbish1і rubbish5в цьому прикладі). Як це зробити?

Я намагався grep 'a1' -v -A1безрезультатно, і мій sed skillz не дуже великий:}

Мій Google-фу цього разу не зміг мені допомогти, хтось, будь ласка, допоможе!

Відповіді:


16

Спробуйте:

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

Це означає з / ^ a1 $ / до наступного рядка, видалити

^ І $ забезпечують відповідність цілому рядку, тому прихований a1 не буде збігатися.


6
Ви можете захотіти ^і $в цьому матчі змусити відповідати цілі рядки.
Джандер

@Jander: Звичайно, виправлено
asoundmove

12

Наступне буде працювати над не GNU sed( ,+1синтаксис адреси - це розширення GNU):

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

"Починаючи з рядка, який читає точно" a1 ", і закінчуючи наступним рядком, для якого існує початок рядка (тобто наступний рядок), видаліть."

Це набагато менш розширюється, ніж відповідь @ asoundmove, однак для видалення різної кількості рядків буде потрібно зовсім інший сценарій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.