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