Како да најдете совпаѓања со шаблони низ повеќе линии со 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