Jak mogę grepować katalog dla linii zawierających „Foo”, ale dopasowywać tylko, gdy następny wiersz zawiera również „Bar”?
grep
regular-expression
Nathan Long
źródło
źródło
Odpowiedzi:
@ warl0ck wskazał mi właściwy kierunek
pcregrep
, ale powiedziałem: „zawiera”, a nie „jest” i zapytałem o katalog, a nie plik.Wydaje mi się, że to działa.
źródło
Wydaje się, że sam Grep go nie obsługuje, zamiast tego użyj pcregrep:
pcregrep -M "Foo\nBar" file
Dostał:
źródło
Foo
iBar
będzie obejmować całą linię.Ze
sed
skryptem:Aby go użyć:
printf
Tutaj zobaczyć wszystkie pliki w bieżącym katalogu w jednym wierszu każdego, i przekazać jesed
.Uwaga : jest to posortowane według kolejności alfabetycznej.
Więcej informacji przydatnych
pattern space
ihold space
TUTAJ .grymoire.com ma naprawdę dobre rzeczy na temat
shell
programowania.źródło
h, n, H, x, p, q
znaczy Bardzo interesujące.pattern space
&hold space
: grymoire.com/Unix/Sed.html#uh-56 lub francuskim commentcamarche.net/faq/9536-sed-introduction-a-sed-part-iUżywając
grep
tylko, możesz zbudować następujący potok:grep -A1 'Foo' input_file | grep -B1 'Bar' | grep 'Foo'
Pierwszy
grep
pobierze wszystkie linie, które zawierają,Foo
a także linię po meczu. Następnie otrzymujemy linie, które zawierają,Bar
jak również linię przed dopasowaniem, i na koniec wyodrębniamy linie z tego wyjścia, które zawierająFoo
.EDYCJA: Jak wskazano manatwork , istnieją pewne problematyczne przypadki, których należy przestrzegać. Chociaż jest to interesujące wyzwanie, z uwagi
grep
na funkcjonalność zorientowaną na linię, każde rozwiązanie z tym rozwiązaniem może być „włamaniem” i prawdopodobnie lepiej jest użyć czegoś,pcregrep
co bardziej pasuje do danego zadania.źródło
find . -name '*.txt' | xargs grep -A1 'Foo' | grep -B1 'Bar'
Chociaż wolę używać rozwiązania Nathana
pcregrep
, oto rozwiązanie wykorzystujące tylko grepObjaśnienie opcji:
-o
wydrukuj tylko pasującą część. Konieczne, ponieważ dołączenie-z
spowoduje wydrukowanie całego pliku (chyba że gdzieś jest \ 0)-z
Traktuj dane wejściowe jako zestaw wierszy zakończonych zerowym bajtem (znak NUL ASCII) zamiast nowego wiersza.-P
składnia wyrażeń regularnych perlEDYCJA: Ta wersja drukuje całe dopasowane linie
źródło
-z
. Niektóre „(. *)” Przed i po całym wyrażeniu spowodowałyby, że wypisałby całe dopasowane linie. Na razie podciągi przed „Foo” i po „Bar” nie są wyświetlane.Z awk:
(ogólna uwaga na temat ograniczenia awk: uwaga, że jeśli niektóre nazwy plików mogą zawierać znaki „=”, musisz przekazać je jako
./filename
zamiastfilename
awk)źródło