Jeśli jakikolwiek wiersz bezpośrednio po dopasowaniu zostanie usunięty, wówczas twój sed
program będzie musiał rozważyć kolejne dopasowania. Innymi słowy, jeśli usuniesz linię po dopasowaniu, które również pasuje, prawdopodobnie prawdopodobnie powinieneś również usunąć linię po tym.
Jest zaimplementowany po prostu - ale trzeba trochę popatrzeć.
printf %s\\n 0 match 2 match match \
5 6 match match match \
10 11 12 match 14 15 |
sed -ne'x;/match/!{g;//!p;}'
0
6
11
12
15
Działa poprzez zamianę przestrzeni wstrzymania i wzorów dla każdej wczytywanej linii - dzięki czemu za każdym razem można porównać ostatnią linię z bieżącą. Tak więc, gdy sed
czyta linię, wymienia zawartość swoich buforów - a poprzednia linia jest wówczas zawartością bufora edycji, podczas gdy bieżąca linia jest umieszczana w miejscu wstrzymania.
sed
Sprawdza więc poprzedni wiersz pod kątem dopasowania do match
, a jeśli go !
nie znaleziono, uruchamiane są dwa wyrażenia w {
funkcji }
. sed
wola g
i miejsca przechowywania przez nadpisanie przestrzeń Pattern - co oznacza, że bieżąca linia jest wówczas w obu luku i wzór przestrzeni - i wtedy będzie //
to sprawdzić na mecz do jej ostatnio skompilowanego wyrażenia regularnego - match
- a jeśli to nie match
ona jest p
zabarwiony
Oznacza to, że linia jest drukowana tylko wtedy, gdy nie, a linia poprzednio poprzednia nie . Zapobiega także wszelkim niepotrzebnym zamianom sekwencji es.match
match
match
Jeśli chcesz wersję, która może upuszczać dowolną liczbę wierszy pojawiających się po match
niej, wymaga trochę więcej pracy:
printf %s\\n 1 2 3 4 match \
match match 8 \
9 10 11 12 13 \
14 match match \
17 18 19 20 21 |
sed -net -e'/match/{h;n;//h;//!H;G;s/\n/&/5;D;}' -ep
... zamień 5 na liczbę linii (w tym dopasowaną linię) , którą chcesz usunąć ...
1
2
3
4
12
13
14
21