Musiałem znaleźć wszystkie pliki, które zawierały określony wzór ciągu. Pierwszym rozwiązaniem, które przychodzi na myśl, jest użycie find piped z xargs grep :
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
Ale jeśli muszę znaleźć wzory, które obejmują więcej niż jedną linię, utknąłem, ponieważ grep waniliowy nie może znaleźć wzorów wielowierszowych.
Odpowiedzi:
Więc odkryłem pcregrep, co oznacza GREP kompatybilne z Perl .
Na przykład, musisz znaleźć pliki, w których po zmiennej „ _name ” bezpośrednio następuje zmienna „ _description ”:
Wskazówka: we wzorze musisz uwzględnić znak końca wiersza. W zależności od platformy może to być '\ n', \ r ',' \ r \ n ', ...
źródło
pcregrep
jest dostępny na komputerach Mac zbrew install pcre
-H
który drukuje nazwę pliku przed każdym meczem:pcregrep -HM
.Dlaczego nie wybierzesz awk :
źródło
awk
które występuje w większości systemów * nix.awk '/Start pattern/,/End pattern/ {printf NR " "; print}' filename
. Można zrobić to ładniej nadając numery linii o stałej szerokościawk '/Start pattern/,/End pattern/ {printf "%-4s ", NR; print}' filename
.Oto przykład użycia GNU
grep
:Zobacz także tutaj
źródło
-z
więc nie dzieli wyszukiwania na jedną linię i-o
wyświetla tylko dopasowaną część.grep -rzl pattern *
-pracowałem, aby uzyskać listę plików (moje polecenie brzmiało , -rzo nie działało)brew reinstall --with-pcre git
grep -P
również używa libpcre, ale jest znacznie szerzej instalowana. Aby znaleźć pełnątitle
sekcję dokumentu HTML, nawet jeśli obejmuje on wiele wierszy, możesz użyć tego:Ponieważ projekt PCRE implementuje standard Perl, skorzystaj z dokumentacji Perla jako odniesienia:
źródło
Oto bardziej przydatny przykład:
Przeszukuje tag tytułu w pliku html, nawet jeśli obejmuje do 5 wierszy.
Oto przykład nieograniczonej liczby linii:
źródło
(?s)
do wyrażenia regularnego, na przykład:"(?s)<html>.*</html>"
$
(na końcu wzoru), aby zaznaczyć, że to koniec linii - chociaż to nie to samo, co pomoc w znalezieniu wielu wzorów linii. Zobacz takżeglob(7)
. Możesz również znaleźć tę stronę internetową, która Cię interesuje: regular-expressions.infoZ wyszukiwarką srebra :
Optymalizacje szybkości poszukiwacza srebra mogłyby tu zabłysnąć.
źródło
Możesz użyć alternatywnego przesiewania grep tutaj (zastrzeżenie: jestem autorem).
Obsługuje dopasowywanie wielowierszowe i ogranicza wyszukiwanie do określonych typów plików po wyjęciu z pudełka:
(przeszukaj wszystkie pliki * .py pod kątem określonego wielowierszowego wzorca wyrażenia regularnego)
Jest dostępny dla wszystkich głównych systemów operacyjnych. Spójrz na stronę próbek, aby zobaczyć, jak można jej użyć do wyodrębnienia wartości wielowierszowych z pliku XML.
źródło
Ta odpowiedź może być przydatna:
Regex (grep) potrzebny do wyszukiwania wieloliniowego
Aby znaleźć rekursywnie, możesz użyć flag -R (rekurencyjne) i --include (wzorzec GLOB). Widzieć:
Użyj składni grep --exclude / - include, aby nie przeszukiwać niektórych plików
źródło
@Marcin: awk przykład non-chciwy:
źródło
źródło
Użycie opcji
ex
/vi
editor i globstar (składnia podobna doawk
ised
):gdzie
aaa
jest Twój punkt początkowy ibbb
końcowy tekst.Aby wyszukiwać rekurencyjnie, spróbuj:
Uwaga: Aby włączyć
**
składnię, uruchomshopt -s globstar
(Bash 4 lub zsh).źródło