Być precyzyjnym
Some text
begin
Some text goes here.
end
Some more text
i chcę wyodrębnić cały blok, który zaczyna się od „początku” do „końca”.
z awk możemy to zrobić awk '/begin/,/end/' text
.
Jak zrobić grep?
Być precyzyjnym
Some text
begin
Some text goes here.
end
Some more text
i chcę wyodrębnić cały blok, który zaczyna się od „początku” do „końca”.
z awk możemy to zrobić awk '/begin/,/end/' text
.
Jak zrobić grep?
Odpowiedzi:
Zaktualizowano 18 listopada 2016 r. (Ponieważ zmieniono zachowanie grep: grep z parametrem -P nie obsługuje teraz
^
i$
zakotwicza [w Ubuntu 16.04 z jądrem v: 4.4.0-21-generic]) ( niepoprawna (nie) poprawka )Uwaga: w przypadku innych poleceń po prostu zamień kotwice „^” i „$” na kotwicę nowej linii
'\n'
______________________________Z poleceniem grep:
Jeśli nie chcesz uwzględniać wzorców „początek” i „koniec”, użyj grep z obsługą Lookbehind i Lookahead.
Możesz także użyć
\K
powiadomienia zamiast twierdzenia Lookbehind.\K
opcja zignoruj wszystko przed dopasowaniem wzorca i zignoruj sam wzorzec.\n
służy do unikania drukowania pustych linii z wydruku.Lub, jak sugeruje @AvinashRaj, istnieje prosty łatwy grep w następujący sposób:
(?s)
mówi grep, aby kropka pasowała do znaków nowej linii.[\s\S]
dopasowuje dowolny znak, który jest albo spacją, albo spacją.Ich wyniki bez uwzględnienia „początku” i „końca” są następujące:
zobacz pełny test wszystkich poleceń tutaj ( przestarzałe, ponieważ zachowanie grep z parametrem -P zostało zmienione )
Uwaga:
^
wskaż początek linii i$
wskaż koniec linii. dodawano je do „początku” i „końca”, aby dopasować je, jeśli są sami w linii.W dwóch poleceniach uciekłem,
$
ponieważ używa on również funkcji „Command Substitution” ($(command)
), która umożliwia wyjście polecenia zastępując nazwę polecenia.Od man grep:
źródło
grep -Pzo "(?<=begin\n)(.|\n)*(?=\nend)" file
aby nie drukować\n
znaku, który istnieje na początku linii.grep -Pzo "(?s)begin.*?end" file
grep -Pzo "begin[\s\S]*?end" file
grep: ein nicht geschütztes ^ oder $ wird mit -Pz nicht unterstützt
Tłumaczenie błędu jest coś w stylu:grep: a not protected ^ or $ is not supported with -Pz
grep
wydaje się zmieniły.Jeśli
grep
nie obsługujesz składni perl (-P
), możesz spróbować połączyć linie, dopasować wzór, a następnie ponownie rozwinąć linie, jak poniżej:źródło