Muszę uzyskać linię pasującą do wzorca przed określoną liczbą linii pliku.
Przykład:
linenum 1.fruits
linenum 2.cherry
linenum 3.apple
.
.
linenum 7.orange
linenum 8.apple2
.
.
.
linenum 20.strawberry
Z powyższego pliku chcę line8. Wiem, że znajdzie się powyżej linii 20 i wiem, że ta linia zawiera apple
.
apple
”) pracujesz? Tylko jakaś linia powyżej linii 20, która maapple
?sed
.Odpowiedzi:
Pomimo tego, że tag jest sed , moja odpowiedź nie działa
sed
.Następujące polecenie pobiera pierwsze 19 wierszy, odrzuca te bez
apple
, a następnie zwraca ostatni wiersz z tego, co zostało:Aby przetworzyć plik o nazwie
file.txt
:źródło
Oto rozwiązanie wykorzystujące
sed
:-n
- pomija drukowanie linii20,$d
- dla dowolnej linii od20
do końca pliku ($
) usuń (d
)/apple/h
- dla każdego wiersza, który pasuje do wyrażenia regularnego/apple/
, skopiuj go do „ hold space ” (h
)19{x;p}
- w linii19
zamień wzór i przytrzymaj spacje (x
) i wydrukuj przestrzeń wzoru (p
)Zauważ, że konieczne jest użycie linii
19
do ostatecznego wydruku, ponieważ wszystkie linie po tym są usuwane. W przeciwnym razie możesz użyć adresu „ ostatniej linii ” -$
.W tym teście dodałem
apple
wiersz 23.źródło
To samo rozwiązanie, co już opublikowane, tym razem w Perlu:
i AWK:
źródło