Како да најдете совпаѓања со шаблони низ повеќе линии со grep
grep
е алатка за пребарување на текст на командната линија која може да наоѓа обрасци и низи во датотеки и други видови на внесување. Повеќето совпаѓања ќе се совпаѓаат само на една линија, но често е корисно да се совпаѓаат со повеќе нови линии.
Усогласување на повеќе нови линии со grep
Ракувањето со повеќелиниски совпаѓања е нешто со што grep
се бори. Подобра алатка за работата е awk
или sed
, кои обете природно се справуваат со повеќелиниско внесување. Користењето на два изрази со запирка меѓу нив ќе се совпадне со сè што е помеѓу тие две обрасци.
awk '/from/,/to/' file
sed -n '/from/,/to/p' file
Сè уште е можно да се справи со ова во grep
, сепак, командата е многу незгодна.
grep -Pz '(?s)from.*n.*to' test
Ова прави неколку работи:
-P
Вклучува Perl Compatible Regex.-z
ја внесува целата датотека како една линија, со „нула бајти“ наместо нова линија. Ова му овозможува на grep да ја обработи целата работа како една линија.(?s)
вклучува PCRE_DOTALL, што прави знакот.
се совпаѓа со кој било знак, вклучувајќи ги и новите линии.од
е почетниот натпревар..*n.*
ќе одговара сè дона
, што е крајниот натпревар.
Генерално, ова ќе го направи за целите на скриптирање, но треба многу да се запамети ако го пишувате ова сами. Исто така, користењето на знамето -o
за печатење само на совпаѓањето, исто така, ќе испечати задоцнет знак од нула бајт, што може да предизвика дополнителни проблеми.
Наместо тоа, користете pcre2grep (Grep компатибилен со Perl)
Regular grep
не е најдобрата алатка за оваа работа, а постои и алтернатива наречена pcre2grep
која ги поддржува Perl Compatible Regular Expressions надвор од кутијата и може да многу лесно одговараат на повеќелинискиот Regex.
Веројатно е инсталиран на вашиот систем, но ако не е, можете да го добиете од вашиот менаџер на пакети:
sudo apt install pcre2-utils
Потоа, само треба да го извршите со параметарот -M
.
pcre2grep -M 'from(n|.)*to' file
Имајте предвид дека ова сè уште бара рачно да одговарате на „нова линија или кој било знак“ со (n|.)*
. Алтернативно, можете да го користите трикот (?s)
за да го вклучите PCRE_DOTALL и да направите знакот точка да одговара и на новите линии.
pcre2grep -M '(?s)from.*to' file