grep --before-context 5
pokazuje 5 linii przed meczem.
Chcę pokazać wszystko przed meczem.
Robienie grep --before-context 99999999
by działało, ale nie jest bardzo ... profesjonalne.
Jak wyświetlić cały plik do dopasowania?
text-processing
awk
sed
grep
Nicolas Raoul
źródło
źródło
sed '/PATTERN/Q' FILE
pominie dopasowaną linię.Q
jest rozszerzeniem GNU, więc nie będzie działać z żadnym sedem.sed
może zastąpić większość funkcjonalności grep.Oznacza to drukowanie od pierwszej linii, aż wzór zostanie dopasowany.
Kilka przykładów zakresu
źródło
wydrukuj do meczu włącznie:
wydrukuj do ALE NIE w tym meczu:
źródło
Q
fajny, ale specyficzny dla GNU afaik,sed -n '/pattern/!p;//q'
byłby bardziej przenośny.!
sprawia, żep
stosuje się do linii nie pasującychpattern
, ale potem//q
myli mnie ...//
oznacza „poprzednie wyrażenie regularne” (myślałem, że oznacza „dopasuj pusty ciąg”). Myślę, że krótsza wersja tego samego rozwiązania tosed -n '/pattern/q;p
:?Następujące
grep
metody czystego GNU nie są wydajne.Wyszukaj wszystko do pierwszego wystąpienia ciągu „ foo ” na pasku plików , używając trzech
grep
s:Dopasowane do ostatniej instancji „ foo ”:
Uwaga: szczegółowe informacje na temat ostatniego
grep
można znaleźć w: Regex (grep) do wyszukiwania wieloliniowego .źródło
grep
s (+ pcre), gdy chodzi o proste uruchomienie pojedynczegosed
wywołania:sed 'x;/./G;//!x;/foo/p;//s/.*//;x;d'
??sed
kod wydaje się wart własnej odpowiedzi lub może zostać dodany do jednego z pozostałych. Re 7grep
s: Ponieważ nie byłogrep
odpowiedzi ... (plus, odpowiedź pomaga pokazać, dlaczego nie.)Dodanie do odpowiedzi Mikela powyżej ...
Aby wydrukować wszystkie wiersze do pierwszego wiersza
FILE
zawierającegoPATTERN
, ale bez uwzględnienia , spróbuj:sed '/.*PATTERN.*/{s///;q;}' FILE
Pasuje do całej linii zawierającej wzorzec, zastępuje ją pustą linią, a następnie kończy pracę bez przetwarzania reszty pliku.
Postscriptum:
Najłatwiejszym / najczystszym sposobem, jaki mogłem wymyślić, aby zapobiec drukowaniu dodatkowej nowej linii na końcu (bez angażowania innego narzędzia), było ponowne uruchomienie sed i usunięcie nowej ostatniej linii:
... a ponieważ i tak usuwamy tę linię, nasza poprzednia praca jest zbędna i możemy uprościć:
źródło
sed
wywołania.tcsh
wbash
aliasie, jak i aliasu, musiałem się upewnić miał stosunkowo zwięzłe jedno-liniowe rozwiązanie, które działało zarówno w standardzie, jak i GNUsed
(w celu przenoszenia); wszystkie wymagania, które Twój wkład mógł bardzo dobrze spełnić. Jako ktoś, kto używased
bardzo rzadko, moim najważniejszym wymogiem było coś, co mogłem szybko zrozumieć, kiedy chcę łatwo edytować lub zmienić przeznaczenie za lata.Dla osób, które decydują się pamiętać tylko podstawowe narzędzia w codziennej pracy i chcą zaakceptować mniej eleganckie i mniej wydajne rozwiązania:
Jeśli to polecenie dotyczy skryptu, będę szukał bardziej eleganckich (i być może wydajnych) rozwiązań. Jeśli jest to jednorazowe polecenie lub skrypt wyrzucający, to mnie to nie obchodzi.
źródło
Możesz także użyć jednego z poniższych
lub
lub
Pierwsza opcja jest bardzo podobna do sugerowanej przez PO, tylko upewnia się, że ti pokazuje wystarczającą liczbę linii przed kontekstem, zliczając linie w pliku
Druga opcja przeszukuje numer wiersza pierwszego dopasowania (możesz to również zmienić, zmieniając wewnętrzną „głowę”), a następnie używa głowy na tym numerze
Ostatnia opcja zastępuje wszystkie nowe linie dopasowaniem, a następnie zastępuje dwa sąsiednie dopasowania nową linią. Wynikiem tego jest wiersz dla każdego bloku tekstu między dwoma dopasowaniami. Następnie używa „head”, aby wybrać pierwszy wiersz (zmieniając blok tekstu do pierwszego dopasowania), a następnie ponownie tłumaczy każde dopasowanie do nowego wiersza. ta opcja działa tylko wtedy, gdy plik ma następujący format
i tak dalej
źródło
sed
polecenie na dole jest dość srogie.