Jak wyszukiwać frazy w wielu wierszach? Np. Pozwólmy, aby wyrażenie „moja mrożona herbata” mogło być zawinięte w pliki tekstowe:
as js skdfh dfh djh sf my
ice tea.
grep nie pasuje, ponieważ pomiędzy nimi jest nowa linia. Jak mogę je dopasować? Innym wzorem byłby wieloliniowypattern1_\n_pattern2
Wiem, że najłatwiejszym sposobem, w jaki robię bankomat, jest po prostu grep dla jednej części, np. Po prostu lód z flagą -A2 -B2, a następnie w tym wyjściu, na przykład dla herbaty. Ale to jest bardzo nużące. Ciekawi mnie więc, jak byś to rozwiązał.
Odpowiedzi:
Możesz zainstalować
pcregrep
(dostępny w większości repozytoriów dystrybucji) - co jest grep przy użyciu biblioteki pcre , która wykonuje „wyrażenia regularne zgodne z Perl”. Posiada opcję wiersza poleceń-M
, który pozwala zrobić multilinii wyszukiwań - od strony człowieka :Więc możesz to zrobić
Jest
\s
to biały znak , który będzie pasował\n
oraz\r
w trybie wielowierszowym, oprócz zwykłych znaków białych znaków. Możesz także dopasować znak nowej linii bezpośrednio, więc możesz to zrobićźródło
grep -E
wykonuje się wzorów pcre??
,+
,{
,|
,(
, i)
jak ich zwykłym znaczeniu regex bez konieczności mieć\
z przodu, jak to zrobić, jeśli używasz standardowego grep. Więcgrep 'hello\s\+world' file
jest równoważnagrep -E 'hello\s+world' file
. To nie robi PCRE. Jestgrep -P
dla wyrażeń regularnych perla, ale jest eksperymentalny (według strony podręcznika) i myślę, że różni się nieco od pcregrep ...-P
kiedy to powiedziałem-E
, ale nie zdawałem sobie sprawy, że było inaczej.I prawdopodobnie nie szukaj używając
vim
„s:vimgrep
polecenie. Działa to w sposób nieco podobny do tego,grep
ale obsługuje RE i ścieżki vim.Zasadniczo uruchamiasz coś w rodzaju
:vimgrep 'pattern1\npattern2' path/**
wyszukiwania rekurencyjnego, a następnie piszesz,:copen
aby wyświetlić mniejsze okno zawierające listę dopasowań.vim
RE mogą robić głównie wszystko, co PCRE, ale ewoluowały niezależnie od linii wyrażeń regularnych Perla, więc większość zaawansowanych rzeczy działa inaczej. Ich podstawowa funkcjonalność jest bardziej podobna do podstawowych RE, ale mają kilka ciekawych dodatków, których nie oferują PCRE.Nie jestem pewien, czy da się
:vimgrep
wypluć dane tak jakgrep
to; Próbowałem go używać tylko do nawigacji wewnątrzvim
.:help vimgrep
od wewnątrz,vim
aby uzyskać więcej informacji;:help pattern.txt
dla informacji ovim
RE; Aby uzyskać więcej informacji na temat ścieżek zobacz:help wildcards
.źródło
.vimrc
? Powinien być bardziej przenośny niżgrep
w odniesieniu do systemu operacyjnego:vim
nie ma „posixowego smaku” i działa mniej więcej identycznie, nawet w systemie Windows. .................................................. ........................... Możliwe jest dodanie kwalifikatorów, aby zapewnić, że np. Odpowiednia ilość „magii” zostanie wykorzystana w RE jak rozumiem, istnieje surowa niepisana zasada, aby pozostawić tę opcję samemu sobie.find.exe
zamiastgrep
). W ciągu ostatnich kilku tygodni było inne pytanie, które dotyczyło tego problemu.:vimgrep
lub:grep
? From:help grep
: „Zaletą wewnętrznego grep [tj.:vimgrep
] Jest to, że działa on na wszystkich systemach i wykorzystuje zaawansowane wzorce wyszukiwania Vima”.Grep działa tylko na jednej linii na raz, ale możesz użyć awk do drukowania linii pasujących do szeregu wzorów:
pasowałoby do wszystkiego, nie tylko nowych linii między tymi dwoma wzorami
źródło
Aby w pełni wykorzystać uniks, musisz skorzystać z potoków. Możesz to zrobić w zwykły sposób
grep
za pomocą rur (nie potrzebujesz trójnika):Którego nie uważałbym za nudne.
źródło