Jeśli jakikolwiek wiersz bezpośrednio po dopasowaniu zostanie usunięty, wówczas twój sedprogram 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 sedczyta 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.
sedSprawdza więc poprzedni wiersz pod kątem dopasowania do match, a jeśli go !nie znaleziono, uruchamiane są dwa wyrażenia w {funkcji }. sedwola gi 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 matchona jest pzabarwiony
Oznacza to, że linia jest drukowana tylko wtedy, gdy nie, a linia poprzednio poprzednia nie . Zapobiega także wszelkim niepotrzebnym zamianom sekwencji es.match matchmatch
Jeśli chcesz wersję, która może upuszczać dowolną liczbę wierszy pojawiających się po matchniej, 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