Si të gjeni përputhjet e modeleve nëpër linja të shumta me grep


grep është një mjet kërkimi për tekstin e linjës së komandës që është në gjendje të gjejë modele dhe vargje në skedarë dhe lloje të tjera të dhënash. Shumica e ndeshjeve do të përputhen vetëm në një rresht, por shpesh është e dobishme të përputhen me shumë linja të reja.

Përputhja në shumë linja të reja me grep

Trajtimi i ndeshjeve me shumë rreshta është diçka me të cilën grep përballet. Një mjet më i mirë për punën është awk ose sed, të cilat të dyja trajtojnë natyrshëm hyrjen me shumë rreshta. Përdorimi i dy shprehjeve me presje midis tyre do të përputhet me gjithçka midis këtyre dy modeleve.

awk '/from/,/to/' file
sed -n '/from/,/to/p' file

Është ende e mundur për ta trajtuar këtë në grep, megjithatë, komanda është shumë e ngathët.

grep -Pz '(?s)from.*n.*to' test

Kjo bën disa gjëra:

  • -P Aktivizon Perl Compatible Regex.
  • -z ushqen të gjithë skedarin si një rresht, me zero bajt në vend të një rreshti të ri. Kjo i lejon grep të përpunojë të gjithë si një rresht.
  • (?s) aktivizon PCRE_DOTALL, gjë që bën që karakteri .  të përputhet me çdo karakter, duke përfshirë linjat e reja.
  • nga është ndeshja fillestare.
  • .*n.* do të përputhet me gjithçka deri në me, që është ndeshja përfundimtare.

Në përgjithësi, kjo do ta bëjë atë për qëllime skriptimi, por është shumë për t'u mbajtur mend nëse po e shkruani vetë. Gjithashtu, përdorimi i flamurit -o për të printuar vetëm ndeshjen do të printojë gjithashtu një karakter pasardhës zero bajt, gjë që mund të shkaktojë probleme shtesë.

Duke përdorur pcre2grep në vend të kësaj (Perl-Compatible grep)

Regular grep nuk është mjeti më i mirë për këtë punë dhe ekziston një alternativë e quajtur pcre2grep që paketon në mbështetje për Perl Compatible Regular Expressions jashtë kutisë dhe është në gjendje të përshtatni shumë lehtë Regex me shumë linja.

Ndoshta është i instaluar në sistemin tuaj, por nëse nuk është, mund ta merrni nga menaxheri i paketave:

sudo apt install pcre2-utils

Më pas, thjesht duhet ta ekzekutoni me parametrin -M .

pcre2grep -M 'from(n|.)*to' file

Vini re se kjo kërkon që ju të përputheni manualisht linja e re ose ndonjë karakter me (n|.)* . Përndryshe, mund të përdorni trukun (?s) për të aktivizuar PCRE_DOTALL dhe për të bërë që karakteri i pikës të përputhet gjithashtu me linjat e reja.

pcre2grep -M '(?s)from.*to' file