Jak usunąć wiele wierszy na wystąpienie w pliku?


11

Powiedzmy, że mam ten plik linii 857835, zawierający takie rzeczy:

a1
rubbish1
rubbish2
rubbish3
rubbish4
a1
rubbish5
rubbish6
rubbish7
rubbish8

I życzę, aby usunąć wszystkich wystąpień a1i następną linię ( rubbish1i rubbish5w tym przykładzie). Jak mam to zrobić?

Próbowałem grep 'a1' -v -A1bezskutecznie, a moje umiejętności skilli nie są naprawdę świetne:}

Tym razem mój Google-fu nie był w stanie mi pomóc, proszę o pomoc!

Odpowiedzi:


16

Próbować:

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

Oznacza to, że od / ^ a1 $ / do następnego wiersza, usuń

^ I $ zapewniają dopasowanie całej linii, więc ukryte a1 nie będzie dopasowane.


6
Może chcesz ^i $w tym meczu, aby wymusić pasujących całe linie.
Jander

@Jander: Jasne, poprawione
asoundmove

12

Poniższe będzie działać na systemach innych niż GNU sed( ,+1składnia adresu jest rozszerzeniem GNU):

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

„Zaczynając od wiersza, który odczytuje dokładnie„ a1 ”, a kończąc na następnym wierszu, dla którego istnieje początek wiersza (tj. Następny wiersz), usuń.”

Jest to jednak znacznie mniej rozszerzalne niż odpowiedź @ asoundmove, ponieważ usunięcie innej liczby linii wymagałoby zupełnie innego skryptu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.