Izglītības programma par GREP un regulārām izteiksmēm. Regulāro izteiksmju (regex) izmantošana operētājsistēmā Linux Regulāro izteiksmju tabula grep

Utilīta grep ir ļoti spēcīgs meklēšanas un filtru rīks. teksta informācija. Šajā rakstā ir parādīti vairāki tā izmantošanas piemēri, kas ļaus novērtēt tā iespējas.
Galvenais grep lietojums ir vārdu vai frāžu meklēšana failos un izvades straumēs. Varat meklēt, komandrindā ierakstot vaicājumu un meklēšanas apgabalu (failu).
Piemēram, lai failā hystack.txt atrastu virkni “adata”, izmantojiet šo komandu:

$ grep adata siena kaudze.txt

Rezultātā grep parādīs visus adatas gadījumus, ar kuriem tā saskaras faila haystack.txt saturā. Ir svarīgi atzīmēt, ka šajā gadījumā grep meklē rakstzīmju kopu, nevis vārdu. Piemēram, tiks parādītas virknes, kas ietver vārdu “nevajadzīgs” un citus vārdus, kas satur secību “adata”.


Lai pateiktu grep, ka meklējat konkrētu vārdu, izmantojiet slēdzi -w. Šis taustiņš ierobežos meklēšanu tikai ar norādīto vārdu. Vārds ir vaicājums, ko abās pusēs norobežo atstarpes, pieturzīmes vai rindiņu pārtraukumi.

$ grep -w adata siena kaudze.txt

Nav nepieciešams ierobežot meklēšanu tikai ar vienu failu; grep var meklēt failu grupā, un meklēšanas rezultātos tiks norādīts fails, kurā tika atrasta atbilstība. Slēdzis -n pievienos arī rindas numuru, kurā tika atrasta atbilstība, un slēdzis -r ļaus veikt rekursīvu meklēšanu. Tas ir ļoti ērti, meklējot failus ar programmas pirmkodiem.

$ grep -rnw funkcijas_nosaukums /home/www/dev/myprogram/

Faila nosaukums tiks norādīts pirms katras spēles. Ja nepieciešams slēpt failu nosaukumus, izmantojiet slēdzi -h, gluži pretēji, ja nepieciešami tikai failu nosaukumi, tad norādiet slēdzi -l
Nākamajā piemērā mēs meklēsim URL IRC žurnāla failā un parādīsim pēdējās 10 atbilstības.

$ grep -wo http://.* channel.log | asti

Opcija -o liek grep drukāt tikai raksta atbilstību, nevis visu rindu. Izmantojot cauruli, mēs novirzām grep izvadi uz tail komandu, kas pēc noklusējuma izvada pēdējās 10 rindas.
Tagad mēs saskaitīsim ziņojumu skaitu, ko daži lietotāji ir nosūtījuši uz irc kanālu. Piemēram, visas ziņas, kuras sūtīju no mājām un darba. Tie atšķiras ar segvārdu, mājās lietoju segvārdu user_at_home, un darbā user_at_work.

$ grep -c "^user_at_(home|work)" channel.log

Izmantojot opciju -c, grep drukā tikai atrasto atbilstību skaitu, nevis pašas atbilstības. Meklēšanas virkne ir ievietota pēdiņās, jo tajā ir speciālās rakstzīmes, kuras apvalks var atpazīt kā vadības rakstzīmes. Lūdzu, ņemiet vērā, ka pēdiņas nav iekļautas meklēšanas shēmā. Atgrieztā slīpsvītra "" tiek izmantota, lai izvairītos no īpašām rakstzīmēm.
Meklēsim ziņas no cilvēkiem, kuriem patīk “kliegt” kanālā. Ar “kliedzienu” mēs domājam ziņojumus, kas rakstīti blondīnē, ar visiem LIELajiem burtiem. Lai no meklēšanas izslēgtu nejaušus saīsinājumu trāpījumus, mēs meklēsim vārdus, kas sastāv no piecām vai vairāk rakstzīmēm:

$ grep -w "+(5,)" channel.log

Lai iegūtu sīkāku aprakstu, varat skatīt grep man lapu.
Vēl daži piemēri:

# grep sakne /etc/passwd root:x:0:0:root:/root:/bin/bash operators:x:11:0:operators:/root:/sbin/nologin

Parāda rindiņas no faila /etc/passwd, kas satur virknes sakni.

# grep -n sakne /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 12:operator:x:11:0:operator:/root:/sbin/nologin

Turklāt tiek parādīti rindu numuri, kas satur meklēto līniju.

# grep -v bash /etc/passwd | grep -v nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin :/sbin/halt news:x:9:13:news:/var/spool/news: mailnull:x:47:47::/var/spool/mqueue:/dev/null xfs:x:43:43: X fontu serveris:/etc/X11/fs:/bin/false rpc:x:32:32:Portmapper RPC lietotājs:/:/bin/false nscd:x:28:28:NSCD dēmons:/:/bin/false named:x:25:25:Named:/var/named:/bin/false squid:x:23:23::/var/spool/squid:/dev/null ldap:x:55:55:LDAP lietotājs: /var/lib/ldap:/bin/false apache:x:48:48:Apache:/var/www:/bin/false

Pārbauda, ​​kuri lietotāji neizmanto bash, izņemot tos lietotāju kontus, kuru čaulā ir norādīts nologin.

# grep -c false /etc/passwd 7

Uzskaita kontu skaitu, kuru apvalks ir /bin/false.

# grep -i spēles ~/.bash* | grep -v vēsture

Šī komanda parāda rindas no visiem mājas direktorijā esošajiem failiem pašreizējais lietotājs, kuru nosaukumi sākas ar ~/.bash, izņemot tos failus, kuru nosaukumos ir ietverta virknes vēsture, lai izslēgtu failā ~/.bash_history atrastās atbilstības, kurām var būt viena un tā pati rindiņa ar augšējo vai mazo burtu. Lūdzu, ņemiet vērā, ka tiek meklēts vārds “spēles”, tā vietā varat aizstāt jebkuru citu vārdu.
grep komanda un regulārās izteiksmes

Atšķirībā no iepriekšējā piemēra, mēs tagad parādīsim tikai tās rindas, kas sākas ar rindu “root”:

# grep ^root /etc/passwd root:x:0:0:root:/root:/bin/bash

Ja vēlamies redzēt, kuri konti vispār nav izmantojuši čaulu, mēs meklējam rindas, kas beidzas ar rakstzīmi ":".

# grep:$ /etc/passwd news:x:9:13:news:/var/spool/news:

Lai pārbaudītu, vai PATH mainīgais jūsu ~/.bashrc failā ir eksportēts, vispirms atlasiet rindiņas ar "export" un pēc tam meklējiet rindas, kas sākas ar rindu "PATH"; šajā gadījumā MANPATH un citi netiks parādīti iespējamie veidi:

# grep export ~/.bashrc | grep "PATH" eksportēt PATH="/bin:/usr/lib/mh:/lib:/usr/bin:/usr/local/bin:/usr/ucb:/usr/dbin:$PATH"

Rakstzīmju klases

Izteiciens kvadrātiekavās ir rakstzīmju saraksts, kas ietvertas rakstzīmēs [" un "]". Tas atbilst jebkurai atsevišķai rakstzīmei, kas norādīta šajā sarakstā; ja saraksta pirmā rakstzīme ir "^", tad tā atbilst jebkurai rakstzīmei, kas NAV sarakstā. Piemēram, regulārā izteiksme "" atbilst jebkuram atsevišķam ciparam.

Izteiksmē kvadrātiekavās varat norādīt diapazonu, kas sastāv no divām rakstzīmēm, kas atdalītas ar defisi. Tad izteiksme sakrīt ar jebkuru vienu, kas saskaņā ar kārtošanas noteikumiem ietilpst šajās divās rakstzīmēs, ieskaitot šīs divas rakstzīmes; tas ņem vērā lokalizācijā norādīto salīdzināšanu un rakstzīmju kopu. Piemēram, ja noklusējuma lokalizācija ir C, izteiksme "" ir līdzvērtīga izteiksmei "". Ir daudzas lokalizācijas, kurās kārtošana tiek veikta vārdnīcu secībā, un šajās lokalizācijās "" parasti nav līdzvērtīgs vārdam "", kurā, piemēram, tas var būt līdzvērtīgs izteicienam "". Lai izmantotu tradicionālo iekavās ievietotās izteiksmes interpretāciju, varat izmantot C lokalizāciju, iestatot vides mainīgo LC_ALL uz "C".

Visbeidzot, ir īpaši nosauktas rakstzīmju klases, kuras ir norādītas izteiksmēs kvadrātiekavās. Papildus informācija Lai iegūtu informāciju par šīm iepriekš definētajām izteiksmēm, skatiet rokasgrāmatas lapas vai grep komandas dokumentāciju.

# grep /etc/group sys:x:3:root,bin,adm tty:x:5: pasts:x:12:mail,postfix ftp:x:50: neviens:x:99: floppy:x:19: xfs:x:43: nfsnobody:x:65534: postfix:x:89:

Piemērā tiek parādītas visas rindas, kurās ir rakstzīme "y" vai rakstzīme "f".
Universālas rakstzīmes (metarakstzīmes)

Izmantojiet "." lai atbilstu jebkurai rakstzīmei. Ja vēlaties visu angļu valodas vārdu sarakstu, kas ņemti no vārdnīcas, kurā ir piecas rakstzīmes, kas sākas ar "c" un beidzas ar "h" (noderīgs krustvārdu mīklu risināšanai):

# grep " " /usr/share/dict/words catch clash cloth coach couch couch cough crash crush

Ja vēlaties rindiņas, kurās ir perioda rakstzīme, parādīt kā literālu, komandā grep norādiet opciju -F. Simboli "< " и «>" nozīmē tukšas rindas esamību pirms un attiecīgi pēc norādītajiem burtiem. Tas nozīmē, ka vārdi vārdu failā ir attiecīgi jāraksta. Ja vēlaties atrast visus vārdus tekstā pēc norādītajiem modeļiem, neņemot vērā tukšās rindas, izlaidiet simbolus "< " и «>", lai precīzāk meklētu tikai vārdus, izmantojiet slēdzi -w.

Lai līdzīgi atrastu vārdus, kuriem var būt neierobežots rakstzīmju skaits starp “c” un “h”, izmantojiet zvaigznīti (*). Tālāk sniegtajā piemērā sistēmas vārdnīcā ir atlasīti visi vārdi, kas sākas ar "c" un beidzas ar "h".

# grep " " /usr/share/dict/words kalifs naudas nozveja marli gepards -- izeja izlaista--

Ja vēlaties failā vai izvades straumē atrast burtisku zvaigznītes rakstzīmi, izmantojiet atsevišķi pēdiņas. Lietotājs zemāk esošajā piemērā vispirms mēģina meklēt "zvaigznīti" failā /etc/profile, neizmantojot pēdiņas, kā rezultātā nekas netiek atrasts. Ja tiek izmantotas pēdiņas, rezultāts tiek izvadīts:

# grep * /etc/profile # grep "*" /etc/profile for i mapē /etc/profile.d/*.sh ; darīt

Lai pilnībā apstrādātu tekstus bash skriptos, izmantojot sed un awk, jums vienkārši ir jāsaprot regulārās izteiksmes. Šī visnoderīgākā rīka realizācijas var atrast burtiski visur, un, lai gan visas regulārās izteiksmes ir strukturētas līdzīgā veidā un ir balstītas uz vienādām idejām, darbam ar tām dažādās vidēs ir noteiktas iezīmes. Šeit mēs runāsim par regulārām izteiksmēm, kas ir piemērotas lietošanai skriptos komandrinda Linux.

Šis materiāls ir paredzēts kā ievads regulārajās izteiksmēs, paredzēts tiem, kuri, iespējams, pilnībā nezina, kas tās ir. Tāpēc sāksim no paša sākuma.

Kas ir regulārās izteiksmes

Daudzi cilvēki, pirmo reizi ieraugot regulāras izteiksmes, uzreiz domā, ka skatās uz bezjēdzīgu rakstzīmju jucekli. Bet tas, protams, ir tālu no tā. Apskatiet, piemēram, šo regulāro izteiksmi


Mūsuprāt, pat absolūts iesācējs uzreiz sapratīs, kā tas darbojas un kāpēc tas ir vajadzīgs :) Ja īsti nesaproti, lasi tālāk un viss nostāsies savās vietās.
Regulārā izteiksme ir modelis, ko tādas programmas kā sed vai awk izmanto teksta filtrēšanai. Veidnēs tiek izmantotas parastās ASCII rakstzīmes, kas attēlo pašas sevi, un tā sauktās metarakstzīmes, kurām ir īpaša loma, piemēram, ļaujot atsaukties uz noteiktām rakstzīmju grupām.

Regulāro izteiksmju veidi

Regulāro izteiksmju ieviešanai dažādās vidēs, piemēram, programmēšanas valodās, piemēram, Java, Perl un Python, un Linux rīkos, piemēram, sed, awk un grep, ir noteiktas funkcijas. Šīs funkcijas ir atkarīgas no tā sauktajiem regulāro izteiksmju dzinējiem, kas interpretē modeļus.
Linux ir divi regulāro izteiksmju dzinēji:
  • Dzinējs, kas atbalsta POSIX Basic Regular Expression (BRE) standartu.
  • Dzinējs, kas atbalsta POSIX paplašinātās regulārās izteiksmes (ERE) standartu.
Lielākā daļa Linux utilītu atbilst vismaz POSIX BRE standartam, taču dažas utilītas (tostarp sed) saprot tikai BRE standarta apakškopu. Viens no šī ierobežojuma iemesliem ir vēlme šādus utilītus padarīt pēc iespējas ātrākus teksta apstrādē.

POSIX ERE standarts bieži tiek ieviests programmēšanas valodās. Tas ļauj izmantot liela summa rīki regulāro izteiksmju izstrādei. Piemēram, tās var būt īpašas rakstzīmju secības bieži lietotiem rakstiem, piemēram, atsevišķu vārdu vai ciparu kopu meklēšana tekstā. Awk atbalsta ERE standartu.

Pastāv daudz veidu, kā izstrādāt regulāras izteiksmes, kas ir atkarīgas gan no programmētāja viedokļa, gan no tā dzinēja funkcijām, kuram tās ir izveidotas. Nav viegli uzrakstīt universālas regulāras izteiksmes, kuras var saprast jebkurš dzinējs. Tāpēc mēs pievērsīsimies visbiežāk izmantotajām regulārajām izteiksmēm un apskatīsim to ieviešanas iezīmes sed un awk.

POSIX BRE regulārās izteiksmes

Iespējams, vienkāršākais BRE modelis ir regulāra izteiksme, lai meklētu precīzu rakstzīmju secības sastopamību tekstā. Šādi izskatās virknes meklēšana sed un awk:

$ echo "Tas ir tests" | sed -n "/test/p" $ echo "Tas ir tests" | awk "/test/(drukāt $0)"

Teksta atrašana pēc raksta sed


Teksta atrašana pēc raksta awk

Varat pamanīt, ka noteiktā raksta meklēšana tiek veikta, neņemot vērā precīzu teksta atrašanās vietu rindā. Turklāt gadījumu skaitam nav nozīmes. Pēc regulārās izteiksmes atrod dotais teksts jebkurā līnijas vietā līnija tiek uzskatīta par piemērotu un tiek nodota tālākai apstrādei.

Strādājot ar regulārām izteiksmēm, jāņem vērā, ka tās ir reģistrjutīgas:

$ echo "Tas ir tests" | awk "/Test/(print $0)" $ echo "Tas ir tests" | awk "/test/(drukāt $0)"

Regulāras izteiksmes ir reģistrjutīgas

Pirmā regulārā izteiksme neatrada nevienu atbilstību, jo vārds “tests”, kas sākas ar lielo burtu, tekstā neparādās. Otrais, kas konfigurēts, lai meklētu vārdu, kas rakstīts ar lielajiem burtiem, atrada piemērotu rindu straumē.

Regulārajās izteiksmēs varat izmantot ne tikai burtus, bet arī atstarpes un ciparus:

$ echo "Šis atkal ir tests 2" | awk "/test 2/(drukāt $0)"

Teksta fragmenta atrašana, kurā ir atstarpes un cipari

Regulārās izteiksmes dzinējs atstarpes apstrādā kā regulāras rakstzīmes.

Īpaši simboli

Izmantojot dažādi varoņi Regulārajās izteiksmēs jāņem vērā dažas funkcijas. Tādējādi ir dažas īpašas rakstzīmes jeb metarakstzīmes, kuru izmantošanai veidnē ir nepieciešama īpaša pieeja. Šeit tie ir:

.*^${}\+?|()
Ja veidnē ir nepieciešams kāds no tiem, tas būs jāaizver, izmantojot atpakaļvērstās slīpsvītru (backslash) - \ .

Piemēram, ja tekstā jāatrod dolāra zīme, tā ir jāiekļauj veidnē, pirms tam ievadot atsoļa rakstzīmi. Pieņemsim, ka ir fails myfile ar šādu tekstu:

Manā kabatā ir 10 USD
Dolāra zīmi var noteikt, izmantojot šo modeli:

$awk "/\$/(print $0)" mans fails

Īpašas rakstzīmes izmantošana modelī

Turklāt atpakaļvērstā slīpsvītra ir arī īpaša rakstzīme, tādēļ, ja jums tā ir jāizmanto shēmā, tā būs arī jāatceļ. Izskatās, ka divas slīpsvītras seko viena otrai:

$ echo "\ ir īpaša rakstzīme" | awk "/\\/(drukāt $0)"

Izvairīšanās no slīpsvītras

Lai gan slīpsvītra nav iekļauta iepriekš minētajā īpašo rakstzīmju sarakstā, mēģinot to izmantot regulārā izteiksmē, kas rakstīta sed vai awk, tiks parādīta kļūda:

$ atbalss "3/2" | awk "///(drukāt $0)"

Rakstā nepareizi izmantota slīpsvītra

Ja tas ir nepieciešams, tas ir arī jāizvairās:

$ atbalss "3/2" | awk "/\//(drukāt $0)"

Izvairīšanās no slīpsvītras uz priekšu

Enkuru simboli

Parauga saistīšanai ar teksta virknes sākumu vai beigām ir divas speciālās rakstzīmes. Cepures rakstzīme - ^ ļauj aprakstīt rakstzīmju secības, kas atrodas teksta rindiņu sākumā. Ja meklētais raksts atrodas kaut kur citur virknē, regulārā izteiksme uz to nereaģēs. Šī simbola lietošana izskatās šādi:

$ echo "laipni lūdzam likegeeks vietnē" | awk "/^likegeeks/(drukāt $0)" $ echo "likegeeks vietne" | awk "/^likegeeks/(drukāt $0)"

Raksta atrašana virknes sākumā

Rakstzīme ^ ir paredzēta, lai meklētu paraugu rindas sākumā, vienlaikus tiek ņemts vērā arī rakstzīmju reģistrs. Apskatīsim, kā tas ietekmē teksta faila apstrādi:

$awk "/^this/(print $0)" mans fails


Raksta atrašana teksta rindiņas sākumā no faila

Lietojot sed, novietojot vāciņu kaut kur raksta iekšpusē, tas tiks apstrādāts kā jebkura cita parasta rakstzīme:

$ echo "Šis ^ ir tests" | sed -n "/s ^/p"

Vāciņš nav modeļa sākumā sed

Izmantojot to pašu veidni awk, šī rakstzīme ir jāaizpilda:

$ echo "Šis ^ ir tests" | awk "/s\^/(drukāt $0)"

Vāks nav veidnes sākumā awk

Mēs esam izdomājuši, kā meklēt teksta fragmentus, kas atrodas rindas sākumā. Ko darīt, ja jums ir jāatrod kaut kas, kas atrodas rindas beigās?

Dolāra zīme - $, kas ir līnijas beigu enkura rakstzīme, mums palīdzēs:

$ echo "Tas ir tests" | awk "/test$/(drukāt $0)"

Teksta atrašana rindas beigās

Jūs varat izmantot abus enkura simbolus vienā veidnē. Apstrādāsim failu myfile, kura saturs ir parādīts zemāk esošajā attēlā, izmantojot šādu regulāro izteiksmi:

$ awk "/^šis ir tests$/(drukāt $0)" mans fails


Raksts, kas izmanto speciālās rakstzīmes, lai sāktu un beigtu rindu

Kā redzat, veidne atbildēja tikai uz rindiņu, kas pilnībā atbilda norādītajai rakstzīmju secībai un to atrašanās vietai.

Tālāk ir norādīts, kā filtrēt tukšās rindas, izmantojot enkura rakstzīmes.

$awk "!/^$/(drukāt $0)" manu failu
Šajā veidnē es izmantoju nolieguma simbolu, izsaukuma zīmi - ! . Izmantojot šo modeli, tiek meklētas rindas, kurās starp rindas sākumu un beigām nav nekā, un, pateicoties izsaukuma zīme Tiek drukātas tikai līnijas, kas neatbilst šim rakstam.

Punkta simbols

Punktu izmanto, lai atbilstu jebkurai atsevišķai rakstzīmei, izņemot jaunās rindas rakstzīmi. Nodosim failu myfile šai regulārajai izteiksmei, kuras saturs ir norādīts zemāk:

$awk "/.st/(print $0)" mans fails


Punkta izmantošana regulārajās izteiksmēs

Kā redzams no izvaddatiem, paraugam atbilst tikai pirmās divas rindiņas no faila, jo tajās ir rakstzīmju secība “st”, pirms kuras ir cita rakstzīme, savukārt trešajā rindā nav piemērotas secības, un ceturtajam tas ir, bet tas atrodas pašā rindas sākumā.

Rakstzīmju klases

Punkts atbilst jebkurai rakstzīmei, bet ko darīt, ja vēlaties būt elastīgāks, ierobežojot meklējamo rakstzīmju kopu? Šajā situācijā varat izmantot rakstzīmju klases.

Pateicoties šai pieejai, jūs varat organizēt jebkura rakstzīmes meklēšanu no noteiktās kopas. Lai aprakstītu rakstzīmju klasi, tiek izmantotas kvadrātiekavas:

$awk "/th/(print $0)" mans fails


Rakstzīmju klases apraksts regulārā izteiksmē

Šeit mēs meklējam "th" rakstzīmju secību, pirms kuras ir "o" vai "i" rakstzīme.

Klases noder, meklējot vārdus, kas var sākties ar lielo vai mazo burtu:

$ echo "tas ir tests" | awk "/his is a test/(print $0)" $ echo "Tas ir tests" | awk "/viņš ir tests/(izdrukāt $0)"

Meklējiet vārdus, kas var sākties ar mazo vai lielo burtu

Rakstzīmju klases neaprobežojas tikai ar burtiem. Šeit var izmantot citus simbolus. Nav iespējams iepriekš pateikt, kādā situācijā nodarbības būs nepieciešamas - viss ir atkarīgs no risināmās problēmas.

Rakstzīmju klašu noliegšana

Rakstzīmju klases var izmantot arī, lai atrisinātu iepriekš aprakstīto apgriezto problēmu. Proti, tā vietā, lai meklētu klasē iekļautos simbolus, var organizēt meklēšanu visam, kas nav iekļauts klasē. Lai sasniegtu šo regulārās izteiksmes darbību, klases rakstzīmju saraksta priekšā ir jāievieto zīme ^. Tas izskatās šādi:

$ awk "/[^oi]th/(drukāt $0)" mans fails


Personāžu atrašana, kas nav klasē

Šajā gadījumā tiks atrastas “th” rakstzīmju sērijas, pirms kurām nav ne “o”, ne “i”.

Rakstzīmju diapazoni

Rakstzīmju klasēs rakstzīmju diapazonus var aprakstīt, izmantojot domuzīmes:

$awk "/st/(print $0)" mans fails


Rakstzīmju diapazona apraksts rakstzīmju klasē

IN šajā piemērā regulārā izteiksme reaģē uz rakstzīmju secību "st", kuras priekšā ir jebkura rakstzīme, kas atrodas iekšā alfabētiska secība, starp rakstzīmēm "e" un "p".

Diapazonus var izveidot arī no skaitļiem:

$ atbalss "123" | awk "//" $ echo "12a" | awk "//"

Regulāra izteiksme, lai atrastu jebkurus trīs skaitļus

Rakstzīmju klasē var būt vairāki diapazoni:

$awk "/st/(print $0)" mans fails


Rakstzīmju klase, kas sastāv no vairākiem diapazoniem

Šī regulārā izteiksme atradīs visas “st” secības, pirms kurām ir rakstzīmes no diapazoni a-f un m-z.

Speciālo raksturu klases

BRE ir īpašas rakstzīmju klases, kuras varat izmantot, rakstot regulāras izteiksmes:
  • [[:alpha:]] — atbilst jebkurai alfabēta rakstzīmei, kas rakstīta ar lielajiem vai mazajiem burtiem.
  • [[:alnum:]] — atbilst jebkurai burtciparu rakstzīmei, proti, rakstzīmēm diapazonā no 0 līdz 9 , A-Z , a-z .
  • [[:blank:]] — atbilst atstarpei un tabulēšanas rakstzīmei.
  • [[:cipars:]] — jebkura cipara rakstzīme no 0 līdz 9.
  • [[:upper:]] - lielie alfabēta rakstzīmes - A-Z .
  • [[:lower:]] - mazie alfabēta rakstzīmes - a-z .
  • [[:print:]] — atbilst jebkurai drukājamai rakstzīmei.
  • [[:punct:]] - atbilst pieturzīmēm.
  • [[:atstarpe:]] - atstarpes rakstzīmes, jo īpaši - atstarpe, tabulēšana, rakstzīmes NL, FF, VT, CR.
Varat izmantot īpašas klases šādās veidnēs:

$ atbalss "abc" | awk "/[[:alpha:]]/(drukāt $0)" $ echo "abc" | awk "/[[:digit:]]/(drukāt $0)" $ echo "abc123" | awk "/[[:digit:]]/(drukāt $0)"


Speciālo rakstzīmju klases regulārajās izteiksmēs

Zvaigznes simbols

Ja rakstā aiz rakstzīmes ievietojat zvaigznīti, tas nozīmēs, ka regulārā izteiksme darbosies, ja rakstzīme virknē parādīsies neskaitāmas reizes, ieskaitot situāciju, kad rakstzīmes virknē nav.

$ atbalss "tests" | awk "/tes*t/(print $0)" $ echo "tessst" | awk "/tes*t/(drukāt $0)"


Rakstzīmes * izmantošana regulārajās izteiksmēs

Šo aizstājējzīmi parasti izmanto vārdiem, kuri tiek pastāvīgi uzrakstīti nepareizi, vai vārdiem, uz kuriem attiecas dažādi varianti pareiza pareizrakstība:

$ atbalss "Man patīk zaļa krāsa" | awk "/colou*r/(print $0)" $ echo "Man patīk zaļa krāsa" | awk "/colou*r/(drukāt $0)"

Atrodiet vārdu ar dažādu rakstību

Šajā piemērā viena un tā pati regulārā izteiksme reaģē gan uz vārdu "krāsa", gan uz vārdu "krāsa". Tas ir tāpēc, ka rakstzīme “u”, kam seko zvaigznīte, var nebūt vai parādīties vairākas reizes pēc kārtas.

Vēl viena noderīga funkcija, kas nāk no zvaigznītes simbola, ir apvienot to ar punktu. Šī kombinācija ļauj regulārajai izteiksmei reaģēt uz jebkuru rakstzīmju skaitu:

$ awk "/this.*test/(print $0)" mans fails


Veidne, kas reaģē uz jebkuru rakstzīmju skaitu

Šajā gadījumā nav nozīmes tam, cik un kādas rakstzīmes ir starp vārdiem “this” un “test”.

Zvaigznīti var izmantot arī ar rakstzīmju klasēm:

$ echo "st" | awk "/s*t/(print $0)" $ echo "sat" | awk "/s*t/(print $0)" $ echo "set" | awk "/s*t/(drukāt $0)"


Zvaigznītes lietošana ar rakstzīmju klasēm

Visos trīs piemēros regulārā izteiksme darbojas, jo zvaigznīte aiz rakstzīmju klases nozīmē, ka, ja tiek atrasts jebkāds "a" vai "e" rakstzīmju skaits vai ja neviena nav atrasta, virkne atbildīs norādītajam modelim.

POSIX ERE regulārās izteiksmes

POSIX ERE veidnēs, ko atbalsta dažas Linux utilītas, var būt papildu rakstzīmes. Kā jau minēts, awk atbalsta šo standartu, bet sed ne.

Šeit mēs apskatīsim visbiežāk lietotos simbolus ERE modeļos, kas jums noderēs, veidojot savas regulārās izteiksmes.

▍ Jautājuma zīme

Jautājuma zīme norāda, ka iepriekšējā rakstzīme tekstā var parādīties vienreiz vai vispār neparādīties. Šis varonis ir viens no atkārtošanās metaraksturiem. Šeit ir daži piemēri:

$ echo "tet" | awk "/tes?t/(print $0)" $ echo "tests" | awk "/tes?t/(print $0)" $ echo "tests" | awk "/tes?t/(drukāt $0)"


Jautājuma zīme regulārajās izteiksmēs

Kā redzat, trešajā gadījumā burts “s” parādās divas reizes, tāpēc regulārā izteiksme nereaģē uz vārdu “testst”.

Jautājuma zīmi var izmantot arī ar rakstzīmju klasēm:

$ echo "tst" | awk "/t?st/(print $0)" $ echo "tests" | awk "/t?st/(print $0)" $ echo "garšot" | awk "/t?st/(print $0)" $ echo "taest" | awk "/t?st/(print $0)" $ echo "teest" | awk "/t?st/(drukāt $0)"


Jautājuma zīme un raksturu klases

Ja rindā nav nevienas klases rakstzīmes vai viena no tām ir sastopama vienreiz, regulārā izteiksme darbojas, bet, tiklīdz vārdā parādās divas rakstzīmes, sistēma vairs neatrod atbilstību teksta paraugam.

▍Plus simbols

Plus rakstzīme shēmā norāda, ka regulārā izteiksme atbildīs meklētajam, ja iepriekšējā rakstzīme tekstā parādās vienu vai vairākas reizes. Tomēr šī konstrukcija nereaģēs uz simbola neesamību:

$ atbalss "tests" | awk "/te+st/(print $0)" $ echo "teest" | awk "/te+st/(print $0)" $ echo "tst" | awk "/te+st/(drukāt $0)"


Plus simbols regulārajās izteiksmēs

Šajā piemērā, ja vārdā nav rakstzīmes “e”, regulārās izteiksmes programma neatradīs atbilstības teksta paraugam. Plus simbols darbojas arī ar rakstzīmju klasēm - šādā veidā tas ir līdzīgs zvaigznītei un jautājuma zīmei:

$ echo "tst" | awk "/t+st/(print $0)" $ echo "tests" | awk "/t+st/(print $0)" $ echo "teast" | awk "/t+st/(print $0)" $ echo "teeast" | awk "/t+st/(drukāt $0)"


Plus zīmju un rakstzīmju klases

Tādā gadījumā, ja rindā ir kāda rakstzīme no klases, teksts tiks uzskatīts par atbilstošu modelim.

▍Cirtainas breketes

Cirtainie breketes, ko var izmantot ERE rakstos, ir līdzīgas iepriekš apskatītajiem simboliem, taču tās ļauj precīzāk norādīt nepieciešamo simbola atkārtojumu skaitu pirms tiem. Ierobežojumu var norādīt divos formātos:
  • n - skaitlis, kas norāda precīzu meklēto gadījumu skaitu
  • n, m ir divi skaitļi, kas tiek interpretēti šādi: "vismaz n reizes, bet ne vairāk kā m."
Šeit ir pirmās iespējas piemēri:

$ echo "tst" | awk "/te(1)st/(print $0)" $ echo "tests" | awk "/te(1)st/(drukāt $0)"

Cirtaini breketes rakstos, meklējot precīzu gadījumu skaitu

Vecākajās awk versijās bija jāizmanto komandrindas opcija --re-interval, lai programma atpazītu intervālus regulārajās izteiksmēs, bet jaunākās versijās tas nav nepieciešams.

$ echo "tst" | awk "/te(1,2)st/(print $0)" $ echo "tests" | awk "/te(1,2)st/(print $0)" $ echo "teest" | awk "/te(1,2)st/(print $0)" $ echo "teeest" | awk "/te(1,2)st/(drukāt $0)"


Atstarpes norādītas cirtainajās lencēs

Šajā piemērā rakstzīmei “e” rindā jāparādās 1 vai 2 reizes, tad regulārā izteiksme reaģēs uz tekstu.

Cirtainās breketes var izmantot arī ar rakstzīmju klasēm. Šeit tiek piemēroti jums jau zināmie principi:

$ echo "tst" | awk "/t(1,2)st/(print $0)" $ echo "tests" | awk "/t(1,2)st/(print $0)" $ echo "teest" | awk "/t(1,2)st/(print $0)" $ echo "teeast" | awk "/t(1,2)st/(drukāt $0)"


Cirtaini breketes un raksturu klases

Veidne reaģēs uz tekstu, ja tajā vienu vai divas reizes būs rakstzīme “a” vai rakstzīme “e”.

▍Loģisks simbols “vai”.

Simbols | - vertikāla josla nozīmē loģisku “vai” regulārajās izteiksmēs. Apstrādājot regulāru izteiksmi, kas satur vairākus fragmentus, kas atdalīti ar šādu zīmi, dzinējs uzskatīs analizēto tekstu par piemērotu, ja tas atbilst kādam no fragmentiem. Šeit ir piemērs:

$ echo "Tas ir tests" | awk "/test|exam/(print $0)" $ echo "Šis ir eksāmens" | awk "/test|exam/(print $0)" $ echo "Tas ir kaut kas cits" | awk "/test|eksāmens/(drukāt $0)"


Loģiskais "vai" regulārajās izteiksmēs

Šajā piemērā regulārā izteiksme ir konfigurēta, lai tekstā meklētu vārdus “tests” vai “eksāmens”. Lūdzu, ņemiet vērā, ka starp veidnes fragmentiem un simbolu, kas tos atdala | nedrīkst būt atstarpēm.

Regulārās izteiksmes fragmentus var grupēt, izmantojot iekavas. Ja jūs sagrupējat noteiktu rakstzīmju secību, sistēma to uztvers kā parastu rakstzīmi. Tas ir, piemēram, uz to var attiecināt atkārtojuma metarakstzīmes. Tas izskatās šādi:

$ atbalss "Patīk" | awk "/Like(Geeks)?/(print $0)" $ echo "LikeGeeks" | awk "/Patīk(Geeks)?/(drukāt $0)"


Regulāro izteiksmju fragmentu grupēšana

Šajos piemēros vārds “Geeks” ir ievietots iekavās, kam seko jautājuma zīme. Atcerieties, ka jautājuma zīme nozīmē “0 vai 1 atkārtojums”, tāpēc regulārā izteiksme atbildēs gan uz virkni “Patīk”, gan uz virkni “LikeGeeks”.

Praktiski piemēri

Tagad, kad esam apskatījuši regulāro izteiksmju pamatus, ir pienācis laiks ar tām darīt kaut ko noderīgu.

▍ Failu skaita skaitīšana

Uzrakstīsim bash skriptu, kas saskaita failus, kas atrodas direktorijās un ir ierakstīti mainīgajā vides PATH. Lai to izdarītu, vispirms ir jāģenerē direktoriju ceļu saraksts. Darīsim to, izmantojot sed, aizstājot kolus ar atstarpēm:

$ echo $PATH | sed "s/:/ /g"
Komanda aizstāt atbalsta regulārās izteiksmes kā teksta meklēšanas modeļus. Šajā gadījumā viss ir ārkārtīgi vienkārši, mēs meklējam resnās zarnas simbolu, bet neviens mums netraucē šeit izmantot kaut ko citu - viss ir atkarīgs no konkrētā uzdevuma.
Tagad jums ir jāiet cauri iegūtajam sarakstam cilpā un jāveic darbības, kas nepieciešamas, lai saskaitītu failu skaitu. Skripta vispārīgais izklāsts būs šāds:

Mypath=$(echo $PATH | sed "s/:/ /g") direktorijam $mypath do done
Tagad rakstīsim pilnu skripta tekstu, izmantojot komandu ls, lai iegūtu informāciju par failu skaitu katrā direktorijā:

#!/bin/bash mypath=$(echo $PATH | sed "s/:/ /g") count=0 direktorijam $mypath do check=$(ls $directory) vienumam $check do count=$ [ $count + 1 ] done echo "$directory - $count" count=0 darīts
Palaižot skriptu, var izrādīties, ka daži direktoriji no PATH neeksistē, tomēr tas neliedz tam saskaitīt esošos direktorijus esošos failus.


Failu skaitīšana

Šī piemēra galvenā vērtība ir tāda, ka, izmantojot to pašu pieeju, jūs varat atrisināt daudz sarežģītākas problēmas. Kuras tieši ir atkarīgas no jūsu vajadzībām.

▍E-pasta adrešu pārbaude

Ir vietnes ar milzīgām regulāro izteiksmju kolekcijām, kas ļauj pārbaudīt adreses E-pasts, tālruņu numuri, un tā tālāk. Tomēr viena lieta ir paņemt kaut ko gatavu, bet pavisam cita ir kaut ko izveidot pašam. Tātad, rakstīsim regulāro izteiksmi, lai pārbaudītu e-pasta adreses. Sāksim ar avota datu analīzi. Šeit, piemēram, ir noteikta adrese:

[aizsargāts ar e-pastu]
Lietotājvārds, lietotājvārds var sastāvēt no burtciparu un dažām citām rakstzīmēm. Proti, tas ir punkts, domuzīme, pasvītra, plus zīme. Lietotājvārdam seko @ zīme.

Apbruņojušies ar šīm zināšanām, sāksim montēt regulāro izteiksmi no tās kreisās puses, ko izmanto lietotājvārda pārbaudei. Lūk, ko mēs saņēmām:

^(+)@
Šo regulāro izteiksmi var lasīt šādi: “Rinda jāsākas ar vismaz vienu rakstzīmi no kvadrātiekavās norādītās grupas, kam seko @ zīme.”

Tagad - saimniekdatora nosaukuma rinda - resursdatora nosaukums. Šeit ir spēkā tie paši noteikumi, kas attiecas uz lietotājvārdu, tāpēc tā veidne izskatīsies šādi:

(+)
Uz augstākā līmeņa domēna nosaukumu attiecas īpaši noteikumi. Var būt tikai alfabēta rakstzīmes, no kurām jābūt vismaz divām (piemēram, šādos domēnos parasti ir valsts kods), un ne vairāk kā piecām. Tas viss nozīmē, ka veidne adreses pēdējās daļas pārbaudei būs šāda:

\.({2,5})$
To var lasīt šādi: “Vispirms ir jābūt punktam, tad 2–5 alfabēta rakstzīmēm, un pēc tam rinda beidzas.”

Sagatavojot veidnes atsevišķām regulārās izteiksmes daļām, saliksim tās kopā:

^(+)@(+)\.({2,5})$
Tagad atliek tikai pārbaudīt notikušo:

$ atbalss " [aizsargāts ar e-pastu]" | awk "/^(+)@(+)\.((2,5))$/(drukāt $0)" $ echo " [aizsargāts ar e-pastu]" | awk "/^(+)@(+)\.((2,5))$/(drukāt $0)"


E-pasta adreses apstiprināšana, izmantojot regulārās izteiksmes

Fakts, ka awk nosūtītais teksts tiek parādīts ekrānā, nozīmē, ka sistēma to atpazina kā e-pasta adresi.

Rezultāti

Ja raksta pašā sākumā sastaptā regulārā izteiksme e-pasta adrešu pārbaudei toreiz šķita pilnīgi nesaprotama, mēs ceram, ka tagad tā vairs neizskatās pēc bezjēdzīgas rakstzīmju kopas. Ja tas tiešām tā ir, tas nozīmē šo materiālu izpildīja savu mērķi. Faktiski regulārās izteiksmes ir tēma, kuru varat pētīt visu mūžu, taču pat tas mazais, ko mēs esam aplūkojuši, jau var palīdzēt rakstīt skriptus, kas apstrādā tekstus diezgan progresīvi.

Šajā materiālu sērijā mēs parasti rādījām ļoti vienkāršus piemērus bash skripti, kas sastāvēja burtiski no vairākām rindām. Nākamreiz skatīsimies uz kaut ko lielāku.

Cienījamie lasītāji! Vai, apstrādājot tekstu komandrindas skriptos, izmantojat regulārās izteiksmes?

Viena no noderīgākajām un funkcijām bagātākajām komandām Linux terminālis- komanda "grep". Grep ir akronīms, kas apzīmē “globālās regulārās izteiksmes drukāšana” (tas ir, “visur meklējiet virknes, kas atbilst regulārai izteiksmei, un izdrukājiet tās”). Tas nozīmē, ka grep var izmantot, lai redzētu, vai ievade atbilst noteiktiem modeļiem.

Šī šķietami triviālā programma ir ļoti spēcīga, ja to izmanto pareizi. Tā spēja kārtot ievadi, pamatojoties uz sarežģītiem noteikumiem, padara to par populāru saiti daudzās komandu ķēdēs.

Šajā apmācībā aplūkotas dažas grep komandas iespējas un pēc tam pāriet uz regulāro izteiksmju izmantošanu. Viss aprakstīts sadaļā šo rokasgrāmatu paņēmienus var izmantot virtuālā servera pārvaldībā.

Lietošanas pamati

Vienkāršākajā formā grep tiek izmantots, lai teksta failā atrastu burtu rakstu atbilstību. Tas nozīmē, ka, ja grep tiek dots meklēšanas vārds, tas izdrukās katru faila rindiņu, kurā ir šis vārds.

Piemēram, varat izmantot grep, lai Ubuntu sistēmā GNU vispārējās publiskās licences 3. versijā atrastu rindas, kurās ir vārds "GNU".

cd /usr/share/common-licences
grep "GNU" GPL-3
GNU VISPĀRĒJĀ PUBLISKĀ LICENCE





13. Izmantojiet ar GNU Affero vispārējo publisko licenci.
saskaņā ar GNU Affero vispārējās publiskās licences 3. versiju
...
...

Pirmais arguments "GNU" ir paraugs, kas jāmeklē, un otrais arguments "GPL-3" ir atrodamais ievades fails.

Rezultātā tiks izvadītas visas rindas, kas satur teksta modeli. Dažos Linux izplatījumi meklētais raksts tiks izcelts izvades rindās.

Vispārīgas iespējas

Pēc noklusējuma komanda grep ievades failā vienkārši meklē stingri norādītus modeļus un izdrukā atrastās rindas. Tomēr grep darbību var mainīt, pievienojot dažus papildu karogus.

Ja jums ir jāignorē meklēšanas parametra reģistrs un jāmeklē gan lielie, gan mazie burtu varianti, varat izmantot utilītas "-i" vai "--ignore-case".

Piemēram, varat izmantot grep, lai tajā pašā failā meklētu vārdu "licence", kas rakstīts ar lielajiem, mazajiem vai jauktajiem burtiem.

grep -i "licence" GPL-3
GNU VISPĀRĒJĀ PUBLISKĀ LICENCE
punktā, bet to mainīt nav atļauts.
GNU vispārējā publiskā licence ir bezmaksas, copyleft licence
Licences lielākajai daļai programmatūras un citu praktisku darbu ir izstrādātas
GNU vispārējā publiskā licence ir paredzēta, lai garantētu jūsu brīvību
GNU vispārējā publiskā licence lielākajai daļai mūsu programmatūras; tas attiecas arī uz


"Šī licence" attiecas uz GNU vispārējās publiskās licences 3. versiju.
“Programma” attiecas uz jebkuru ar autortiesībām aizsargātu darbu, kas licencēts saskaņā ar šo
...
...

Kā redzat, izvade satur "LICENSE", "licence" un "License". Ja failā būtu "LiCeNsE" gadījums, tas arī tiktu izvadīts.
Ja jums ir jāatrod visas rindas, kurās nav norādītā raksta, varat izmantot karogus "-v" vai "--invert-match".

Piemēram, varat izmantot šo komandu, lai meklētu BSD licencē visas rindas, kurās nav vārda "the":

grep -v "BSD".
Visas tiesības aizsargātas.
Pārdale un izmantošana avota un binārā formā, ar vai bez
ir izpildīti:
var izmantot, lai atbalstītu vai reklamētu produktus, kas iegūti no šīs programmatūras
bez īpašas iepriekšējas rakstiskas atļaujas.
ŠO PROGRAMMATŪRU NODROŠINA REĢENTI UN LĪDZNIEKI TĀDU, KĀDA IR"" UN
JEBKĀDAS TIEŠAS VAI NETIEŠAS GARANTIJAS, IESKAITOT, BET NE Aprobežojoties ar
...
...

Kā redzat, pēdējās divas rindas tika izvadītas kā nesaturošas vārda "the", jo netika izmantota komanda "ignorēt reģistru".

Vienmēr ir noderīgi zināt rindu numurus, kur tika atrastas atbilstības. Tos var atrast, izmantojot karodziņus "-n" vai "--line-number".

Ja lietojat šo karogu iepriekšējā piemērā, tiks parādīts šāds rezultāts:

grep -vn "the" BSD
2: Visas tiesības paturētas.
3:
4: Pārdale un izmantošana avota un binārā formā, ar vai bez
6:ir izpildīti:
13: var izmantot, lai atbalstītu vai reklamētu produktus, kas iegūti no šīs programmatūras
14: bez īpašas iepriekšējas rakstiskas atļaujas.
15:
16:ŠO PROGRAMMATŪRU NODROŠINA REĢENTI UN IESNIEDZĒJI TĀDU TĀDU, KĀDA IR""
17: JEBKĀDAS TIEŠAS VAI NETIEŠAS GARANTIJAS, IESKAITOT, BET NE Aprobežojoties ar
...
...

Tagad varat atsaukties uz rindas numuru, kad nepieciešams veikt izmaiņas katrā rindā, kurā nav ietverts "the".

Regulāras izteiksmes

Kā minēts ievadā, grep nozīmē “globālās regulārās izteiksmes drukāšana”. Regulārā izteiksme ir teksta virkne, kas apraksta noteiktu meklēšanas modeli.

Dažādas lietojumprogrammas un programmēšanas valodas regulāras izteiksmes izmanto nedaudz atšķirīgi. Šī apmācība aptver tikai nelielu veidu apakškopu, kā aprakstīt Grep modeļus.

Burtu sērkociņi

Iepriekš minētajos vārdu "GNU" un "the" meklēšanas piemēros tika meklētas ļoti vienkāršas regulāras izteiksmes, kas precīzi atbilst rakstzīmju virknei "GNU" un "the".

Pareizāk ir tos uzskatīt par rakstzīmju virkņu sakritībām, nevis kā vārdu sakritībām. Tiklīdz jūs iepazīsities ar sarežģītākiem modeļiem, šī atšķirība kļūs nozīmīgāka.

Raksti, kas precīzi atbilst dotajām rakstzīmēm, tiek saukti par "burtu" rakstiem, jo ​​tie atbilst rakstam burts pēc burta, rakstzīme pēc rakstzīmes.

Visas alfabētiskās un ciparu rakstzīmes (un dažas citas rakstzīmes) burtiski sakrīt, ja vien tās nav modificētas ar citiem izteiksmes mehānismiem.

Enkura spēles

Enkuri ir īpašas rakstzīmes, kas norāda atrašanās vietu vajadzīgās atbilstības virknē.

Piemēram, varat norādīt, ka meklēšanai ir vajadzīgas tikai rindas, kuru pašā sākumā ir vārds “GNU”. Lai to izdarītu, pirms burtu virknes ir jāizmanto enkurs “^”.

Šajā piemērā tiek drukātas tikai tās rindas, kuru sākumā ir vārds "GNU".

grep "^GNU" GPL-3
GNU vispārējā publiskā licence lielākajai daļai mūsu programmatūras; tas attiecas arī uz
GNU vispārējā publiskā licence, jūs varat izvēlēties jebkuru versiju, kas jebkad ir publicēta

Tāpat enkuru "$" var izmantot aiz burtiskas virknes, lai norādītu, ka atbilstība ir derīga tikai tad, ja meklējamā rakstzīmju virkne atrodas teksta virknes beigās.

Šī regulārā izteiksme drukā tikai tās rindas, kuru beigās ir "un":

grep "and$" GPL-3
ka šai bezmaksas programmatūrai nav garantijas. Gan lietotājiem" un
Precīzi noteikumi un nosacījumi kopēšanai, izplatīšanai un


alternatīva ir atļauta tikai reizēm un nekomerciāli, un
tīklu var liegt, ja pati modifikācija būtiski un
negatīvi ietekmē tīkla darbību vai pārkāpj noteikumus un
provizoriski, ja vien un līdz brīdim, kad autortiesību īpašnieks skaidri un
saņem licenci no sākotnējiem licences devējiem, lai palaistu, modificētu un
izgatavot, lietot, pārdot, piedāvāt pārdošanai, importēt un citādi palaist, modificēt un

Atbilst jebkuram raksturam

Punkts (.) tiek izmantots regulārajās izteiksmēs, lai norādītu, ka norādītajā vietā var parādīties jebkura rakstzīme.

Piemēram, ja vēlaties atrast atbilstības, kurās ir divas rakstzīmes un pēc tam secība "cept", izmantojiet šādu paraugu:

grep "..cept" GPL-3
izmantošana, kas ir tieši tur, kur tas ir visnepieņemamākais. Tāpēc mēs
pārkāpums saskaņā ar piemērojamo autortiesību likumu, izņemot tā izpildi a
paziņo lietotājam, ka darbam nav garantijas (izņemot

atsevišķi rakstiskas licences formā vai norādīti kā izņēmumi;
Jūs nedrīkstat izplatīt vai pārveidot aptverto darbu, izņemot nepārprotami norādītos gadījumos
9. Pieņemšana nav nepieciešama, lai iegūtu kopijas.
...
...

Kā redzat, rezultātos ir iekļauti vārdi “pieņemt” un “izņemot”, kā arī šo vārdu variācijas. Raksts arī atbilstu secībai “z2cept”, ja tas būtu tekstā.

Izteicieni iekavās

Ievietojot rakstzīmju grupu kvadrātiekavās (""), varat norādīt, ka šajā vietā var parādīties jebkura no iekavās esošajām rakstzīmēm.

Tas nozīmē, ka, ja jums ir jāatrod virknes, kurās ir "pārāk" vai "divi", varat īsi norādīt šīs variācijas, izmantojot šādu paraugu:

grep "uz" GPL-3
arī jūsu programmas.

Izstrādātāji, kas izmanto GNU GPL, aizsargā jūsu tiesības, veicot divas darbības:
datortīkls bez kopijas pārsūtīšanas netiek pārraidīts.

Atbilstošais avots no tīkla servera bez maksas.
...
...

Kā redzat, failā tika atrastas abas variācijas.

Rakstzīmju ievietošana iekavās nodrošina arī vairākas noderīgas funkcijas. Varat norādīt, ka viss, izņemot rakstzīmes iekavās, atbilst modelim, iekavās esošo rakstzīmju sarakstu sākot ar rakstzīmi “^”.

Šajā piemērā tiek izmantots modelis ".ode", kas nedrīkst atbilst "koda" secībai.

grep "[^c]ode" GPL-3
1. Avota kods.
modeli, lai ikvienam, kam ir objekta kods, piešķirtu vai nu (1) a
vienīgais nozīmīgais produkta lietošanas veids.
ievērojiet šo, kad tas sākas interaktīvā režīmā:

Ir vērts atzīmēt, ka otrās rindas izvadē ir vārds "kods". Tā nav regulārā izteiksmes vai grep kļūda.

Drīzāk šī rinda tika izdrukāta, jo tajā ir arī raksta atbilstības secība "režīms", kas atrodama vārdā "modelis". Tas ir, virkne tika nodrukāta, jo tā sakrita ar paraugu.

Vēl viens noderīga funkcija iekavas - iespēja norādīt rakstzīmju diapazonu, nevis ievadīt katru rakstzīmi atsevišķi.

Tas nozīmē, ka, ja jums ir jāatrod katra rindiņa, kas sākas ar lielo burtu, varat izmantot šādu paraugu:

grep "^" GPL-3
GNU vispārējā publiskā licence lielākajai daļai mūsu programmatūras; tas attiecas arī uz

Licence. Katrs licences īpašnieks tiek uzrunāts kā "jūs". "Licences" un


Sistēmas bibliotēkas vai vispārējas nozīmes rīki vai vispārēji pieejami bez maksas
Avots.

...
...

Dažu raksturīgu salīdzināšanas problēmu dēļ, lai iegūtu precīzākus rezultātus, labāk ir izmantot POSIX rakstzīmju klases, nevis rakstzīmju diapazonu, kas izmantots iepriekš minētajā piemērā.
Šajā rokasgrāmatā nav aplūkotas daudzas rakstzīmju klases; piemēram, lai veiktu to pašu procedūru kā iepriekš minētajā piemērā, iekavās varat izmantot rakstzīmju klasi "[:upper:]".

grep "^[[:upper:]]" GPL-3
GNU vispārējā publiskā licence lielākajai daļai mūsu programmatūras; tas attiecas arī uz
Valstīm nevajadzētu ļaut patentiem ierobežot izstrādi un izmantošanu
Licence. Katrs licences īpašnieks tiek uzrunāts kā "jūs". "Licences" un
Komponents, un (b) kalpo tikai, lai nodrošinātu darba izmantošanu ar to
Galvenā sastāvdaļa vai standarta interfeisa ieviešana, kurai an
Sistēmas bibliotēkas vai vispārējas nozīmes rīki vai vispārēji pieejami bez maksas
Avots.
Lietotāja produkts tiek nodots saņēmējam uz visiem laikiem vai uz a
...
...

Atkārtojiet modeli (0 vai vairāk reižu)

Viena no visbiežāk izmantotajām metarakstzīmēm ir simbols "*", kas nozīmē "atkārtot iepriekšējo rakstzīmi vai izteiksmi 0 vai vairāk reizes".

Piemēram, ja vēlaties atrast katru rindiņu ar sākuma vai aizvēršanas iekavām, kurās ir tikai burti un atsevišķas atstarpes starp tām, varat izmantot šādu izteiksmi:

grep "(*)" GPL-3

izplatīšana (ar vai bez izmaiņām), padarot pieejamu
nekā darbs kopumā, ka (a) ir iekļauta parastajā formā
Komponents, un (b) kalpo tikai, lai nodrošinātu darba izmantošanu ar to
(ja tāds ir), kurā darbojas izpildāmais darbs, vai kompilators, ko izmantoja
(ieskaitot fizisku izplatīšanas līdzekli), kam pievienots
(ieskaitot fizisku izplatīšanas līdzekli), ko papildina a
vietu (bez maksas vai par maksu) un piedāvā līdzvērtīgu piekļuvi
...
...

Kā izvairīties no metarakstzīmēm

Dažreiz jums var būt nepieciešams meklēt burtisku periodu vai burtiski atvērtas iekavas. Tā kā šīm rakstzīmēm regulārajās izteiksmēs ir noteikta nozīme, jums tās ir "jāizvairās", pasakot grep, ka to īpašā nozīme šajā gadījumā nav nepieciešama.

Šīs rakstzīmes var izmantot, pirms rakstzīmes izmantojot atpakaļvērstās slīpsvītras (\), kurai parasti ir īpaša nozīme.

Piemēram, ja jums ir jāatrod virkne, kas sākas ar lielo burtu un beidzas ar punktu, varat izmantot tālāk norādīto izteiksmi. Apgrieztā slīpsvītra pirms pēdējā punkta norāda komandai to "aizbēgt", lai pēdējais punkts apzīmē burtisku punktu un tam nav nozīmes "neviena rakstzīme".

grep "^.*\.$" GPL-3
Avots.
Licence, izdarot izņēmumus no viena vai vairākiem tās nosacījumiem.
Licence būtu pilnībā atturēties no Programmas nodošanas.
VISAS NEPIECIEŠAMĀS APKOPES, REMONTS VAI KOREKCIJAS.
TĀDI BOJĀJUMI.
Pievienojiet arī informāciju par to, kā ar jums sazināties pa elektronisko un papīra pastu.

Uzlabotas regulārās izteiksmes

Komandu Grep var izmantot arī ar paplašinātu regulāro izteiksmju valodu, izmantojot karogu -E vai izsaucot komandu egrep, nevis grep.

Šīs komandas paver "paplašināto regulāro izteiksmju" iespējas. Paplašinātās regulārās izteiksmes ietver visas pamata metarakstzīmes, kā arī papildu metarakstzīmes, lai izteiktu sarežģītākas atbilstības.

Grupēšana

Viena no vienkāršākajām un noderīgākajām funkcijām, ko nodrošina paplašinātās regulārās izteiksmes, ir iespēja grupēt izteiksmes un izmantot tās kā vienu vienību.

Izteicienu grupēšanai izmanto iekavas. Ja jums ir jāizmanto iekavas ārpus paplašinātām regulārām izteiksmēm, tās var "izslēgt", izmantojot atpakaļvērsto slīpsvītru

grep "\(grupēšana\)" fails.txt
grep -E "(grupēšana)" fails.txt
egrep "(grupēšana)" fails.txt

Iepriekš minētie izteicieni ir līdzvērtīgi.

Alternatīva

Tāpat kā kvadrātiekavās ir norādītas dažādas iespējamās atbilstības vienai rakstzīmei, starplikšana ļauj norādīt alternatīvas atbilstības rakstzīmju virknēm vai izteiksmju kopām.

Vertikālās joslas simbols “|” tiek izmantots, lai norādītu maiņu. Grupēšana bieži tiek izmantota, lai norādītu, ka viena no divām vai vairākām iespējamām iespējām ir jāuzskata par atbilstību.

Šajā piemērā jums ir jāmeklē “GPL” vai “General Public License”:

grep -E "(GPL|General Public License)" GPL-3
GNU vispārējā publiskā licence ir bezmaksas, copyleft licence
GNU vispārējā publiskā licence ir paredzēta, lai garantētu jūsu brīvību
GNU vispārējā publiskā licence lielākajai daļai mūsu programmatūras; tas attiecas arī uz
cena. Mūsu vispārējās publiskās licences ir izstrādātas, lai pārliecinātos, ka jūs
Izstrādātāji, kas izmanto GNU GPL, aizsargā jūsu tiesības, veicot divas darbības:
Izstrādātāju un autoru aizsardzībai GPL ir skaidri paskaidrots
autoru dēļ, GPL pieprasa, lai pārveidotās versijas būtu atzīmētas kā
ir izstrādājuši šo GPL versiju, lai aizliegtu šādu praksi
...
...

Pārmaiņu var izmantot, lai izvēlētos starp divām vai vairākām iespējām; Lai to izdarītu, atlases grupā jāievada atlikušās opcijas, katru atdalot ar vertikālās joslas simbolu “|”.

Kvantitori

Paplašinātajās regulārajās izteiksmēs ir metarakstzīmes, kas norāda, cik bieži rakstzīme tiek atkārtota, līdzīgi kā metaraksts “*” norāda, ka iepriekšējā rakstzīme vai rakstzīmju virkne atbilst 0 vai vairāk reižu.

Lai atbilstu rakstzīmei 0 vai vairāk reižu, varat izmantot rakstzīmi "?". Tas padarīs iepriekšējo rakstzīmi vai rakstzīmju sēriju būtībā neobligātu.

Šajā piemērā, ievietojot secību “copy” izvēles grupā, tiek parādītas atbilstības “copyright” un “right”:

grep -E "(kopēt)?pareizi" GPL-3
Autortiesības (C) 2007 Free Software Foundation, Inc.
Lai aizsargātu jūsu tiesības, mums ir jāliedz citiem jums liegt
šīs tiesības vai lūdz jūs atteikties no šīm tiesībām. Tāpēc jums ir
zināt savas tiesības.
Izstrādātāji, kas izmanto GNU GPL, aizsargā jūsu tiesības, veicot divas darbības:
(1) aizstāvēt autortiesības uz programmatūru un (2) piedāvāt jums šo Licenci
“Autortiesības” nozīmē arī autortiesībām līdzīgus likumus, kas attiecas uz cita veida autortiesībām
...
...

Rakstzīme "+" atbilst izteiksmēm vienu vai vairākas reizes. Tas darbojas gandrīz kā simbols "*", taču, izmantojot "+", izteiksmei ir jāatbilst vismaz 1 reizi.

Tālāk norādītā izteiksme atbilst virknei “free” plus 1 vai vairāk rakstzīmes, kas nav atstarpes:

grep -E "free[^[:space:]]+" GPL-3
GNU vispārējā publiskā licence ir bezmaksas, copyleft licence
lai atņemtu jums brīvību dalīties un mainīt darbus. Turpretī,
GNU vispārējā publiskā licence ir paredzēta, lai garantētu jūsu brīvību
Kad mēs runājam par bezmaksas programmatūru, mēs runājam par brīvību, nevis
var brīvi izplatīt bezmaksas programmatūras kopijas (un par to jāmaksā

brīvības, ko saņēmāt. Jums ir jāpārliecinās, ka arī viņi saņem
lietotāju aizsardzība" brīvība mainīt programmatūru. Sistemātiska
punktā GPL, ja nepieciešams, lai aizsargātu lietotāju brīvību.
patentus nevar izmantot, lai padarītu programmu par brīvu.

Atkārtoto spēļu skaits

Ja nepieciešams norādīt, cik reižu atbilstības ir jāatkārto, varat izmantot cirtainus lencēs (“( )”). Šie simboli tiek izmantoti, lai norādītu precīzu izteiksmes atbilstību skaita, diapazona un augšējās un apakšējās robežas.

Ja jums ir jāatrod visas rindas, kurās ir trīs patskaņu kombinācija, varat izmantot šādu izteiksmi:

grep -E "(3)" GPL-3
mainītas, lai viņu problēmas netiktu kļūdaini piedēvētas
iepriekšējo versiju autori.
saņemt to jebkurā informācijas nesējā ar nosacījumu, ka jūs pamanāmi un
dot saskaņā ar iepriekšējo punktu, kā arī tiesības uz valdījumu
segtu darbu, lai vienlaikus izpildītu savas saistības saskaņā ar šo
Ja jums ir jāatrod visi vārdi, kas sastāv no 16–20 rakstzīmēm, izmantojiet šādu izteiksmi:
grep -E "[[:alpha:]](16,20)" GPL-3
noteiktus pienākumus, ja izplatāt programmatūras kopijas vai ja
jūs to pārveidojat: pienākumi ievērot citu brīvību.
c) aizliedz sniegt nepatiesu informāciju par šī materiāla izcelsmi vai

secinājumus

Daudzos gadījumos komanda grep ir noderīga, lai atrastu modeļus failos vai hierarhijā failu sistēma. Tas ietaupa daudz laika, tāpēc ir vērts iepazīties ar tā parametriem un sintaksi.

Regulārās izteiksmes ir vēl daudzpusīgākas, un tās var izmantot daudzās populārās programmās. Piemēram, daudzi teksta redaktori izmantojiet regulāras izteiksmes, lai meklētu un aizstātu tekstu.

Turklāt uzlabotās programmēšanas valodas izmanto regulāras izteiksmes, lai izpildītu procedūras konkrētiem datu gabaliem. Zināšanas, kā strādāt ar regulārām izteiksmēm, noder, risinot izplatītas ar datoru saistītas problēmas.

Birkas: ,

Labdien, viesi!

Šodienas rakstā es vēlos pieskarties tik milzīgai tēmai kā Regulāras izteiksmes. Es domāju, ka visi zina, ka regulāro izteiksmju tēma (kā regulāras izteiksmes sauc slengā) ir plaša viena ieraksta ietvaros. Tāpēc es mēģināšu īsi, bet pēc iespējas skaidrāk apkopot savas domas un nodot tās jums .

Ļaujiet man sākt, sakot, ka pastāv vairāki regulāro izteiksmju veidi:

1. Tradicionālās regulārās izteiksmes(tie ir arī pamata, pamata un pamata regulārās izteiksmes(BRE))

  • Šo izteiksmju sintakse ir definēta kā novecojusi, taču tā joprojām ir plaši izplatīta un tiek izmantota daudzās UNIX utilītprogrammās.
  • Pamata regulārās izteiksmes ietver šādas metarakstzīmes (vairāk par to nozīmi tālāk):
    • \( \) — sākotnējā versija priekš ( ) (izvērstā)
    • \(\) — sākotnējā versija priekš () (izvērstā)
    • \n, Kur n- skaitlis no 1 līdz 9
  • Šo metarakstzīmju izmantošanas iezīmes:
    • Zvaigznītei ir jābūt aiz izteiksmes, kas atbilst vienai rakstzīmei. Piemērs: *.
    • Izteiksme \( bloķēt\)* jāuzskata par nepareizu. Dažos gadījumos tas atbilst nullei vai vairākiem virknes atkārtojumiem bloķēt. Citos tas atbilst virknei bloķēt* .
    • Rakstzīmju klasē īpašās rakstzīmju nozīmes lielākoties tiek ignorētas. Īpaši gadījumi:
    • Lai kopai pievienotu rakstzīmi ^, to nedrīkst ievietot pirmajā vietā.
    • Lai kopai pievienotu rakstzīmi -, tā ir jāievieto pirmajā vai pēdējā vietā. Piemēram:
      • DNS nosaukuma veidne, kurā var būt burti, cipari, mīnuss un punkts: [-0-9a-zA-Z.] ;
      • jebkura rakstzīme, izņemot mīnusu un ciparus: [^-0-9] .
    • Lai kopai pievienotu rakstzīmi [ vai ], tā vispirms tajā ir jāievieto. Piemēram:
      • atbilst ], [, a vai b.

2. Uzlabotas regulārās izteiksmes(viņi ir paplašinātās regulārās izteiksmes(ERE))

  • Šo izteiksmju sintakse ir līdzīga galveno izteiksmju sintaksei, izņemot:
    • Noņemta atpakaļvērstā slīpsvītra izmantošana metarakstzīmēm ( ) un ().
    • Slīpssvītra pirms metarakstzīmes ignorē tā īpašo nozīmi.
    • Teorētiski noraidīts neregulāra dizains\ n .
    • Pievienotas metarakstzīmes + , ? , | .

3. Regulāras izteiksmes, kas ir saderīgas ar Perl(viņi ir Ar Perl saderīgas regulārās izteiksmes(PCRE))

  • ir bagātāka un tajā pašā laikā paredzama sintakse nekā pat POSIX ERE, tāpēc tos bieži izmanto lietojumprogrammas.

Regulāras izteiksmes sastāv no veidnes vai drīzāk iestatīt veidni Meklēt. Veidne sastāv no noteikumiem meklējumi, kas sastāv no rakstzīmes Un metarakstzīmes.

Meklēšanas noteikumi nosaka šādi operācijas:

Uzskaitījums |

Caurule (|) atdala derīgus variantus, varētu teikt - loģiski VAI. Piemēram, atbilst "pelēks|pelēks". pelēks vai pelēks.

Grupa vai savienība ()

Apaļās kronšteini tiek izmantoti, lai noteiktu operatoru darbības jomu un prioritāti. Piemēram, "grey|grey" un "gr(a|e)y" ir dažādi modeļi, taču tie abi apraksta kopu, kurā ir pelēks Un pelēks.

Izmērīt ()? *+

Kvantifikators pēc varonis vai grupa nosaka, cik reizes priekštecis var rasties izpausme.

vispārīga izteiksme, atkārtojumi var būt no m līdz n ieskaitot.

vispārīga izteiksme m vai vairāk atkārtojumu.

vispārīga izteiksme ne vairāk kā n atkārtojumus.

gludan atkārtojumi.

Jautājuma zīme nozīmē 0 vai 1 reizes, tāpat kā {0,1} . Piemēram, "colou?r" atbilst un krāsa, Un krāsa.

Zvaigzne nozīmē 0, 1 vai jebkurš skaitlis vienreiz ( {0,} ). Piemēram, atbilst "go*gle". ggle, Google, google un utt.

Plus nozīmē vismaz 1 vienreiz ( {1,} ). Piemēram, atbilst "go+gle". Google, google utt. (bet ne ggle).

Precīza šo regulāro izteiksmju sintakse ir atkarīga no ieviešanas. (tas ir, iekšā pamata regulārās izteiksmes simboliem ( Un )- aizbēga ar slīpsvītru)

Metaraksti, vienkāršā izteiksmē, ir simboli, kas neatbilst to patiesajai nozīmei, tas ir, simbols. (punkts) nav punkts, bet jebkura rakstzīme utt. Lūdzu, iepazīstieties ar metarakstzīmēm un to nozīmi:

. atbilst vienatnē jebkurš simbols
[kaut kas] Atbilstoši jebkurš singls rakstzīmi no tiem, kas likti iekavās. Šajā gadījumā: rakstzīme “-” tiek interpretēta burtiski tikai tad, ja tā atrodas tūlīt pēc atvēršanas vai pirms aizverošās iekavas: vai [-abc]. Pretējā gadījumā tas apzīmē rakstzīmju intervālu. Piemēram, atbilst "a", "b" vai "c". atbilst latīņu alfabēta mazajiem burtiem. Šos apzīmējumus var kombinēt: atbilst a, b, c, q, r, s, t, u, v, w, x, y, z. Lai atbilstu rakstzīmēm “[” vai “]”, pietiek ar to, ka beigu iekava bija pirmā rakstzīme pēc sākuma rakstzīmes: atbilst "]", "[", "a" vai "b". Ja kvadrātiekavās esošās vērtības priekšā ir rakstzīme ^, tad izteiksmes vērtība atbilst viena rakstzīme no tiem kas nav iekavās. Piemēram, [^abc] atbilst jebkurai rakstzīmei, izņemot "a", "b" vai "c". [^a-z] atbilst jebkurai rakstzīmei, izņemot mazos burtus latīņu alfabētā.
^ Atbilst teksta sākumam (vai jebkuras rindiņas sākumam, ja režīms ir pa rindiņai).
$ Atbilst teksta beigām (vai jebkuras rindiņas beigām, ja režīms ir pa rindiņai).
\(\) vai () Deklarē "atzīmētu apakšizteiksmi" (grupētu izteiksmi), ko var izmantot vēlāk (skatiet šo elementu: \ n). "Atzīmēta apakšizteiksme" ir arī "bloks". Atšķirībā no citiem operatoriem, šim operatoram (tradicionālajā sintaksē) ir nepieciešama slīpsvītra; paplašinātajā un Perl operētājsistēmā rakstzīme \ nav nepieciešama.
\n Kur n- tas ir skaitlis no 1 līdz 9; atbilst n th atzīmētā apakšizteiksme (piemēram (abcd)\0, tas ir, rakstzīmes abcd ir atzīmētas ar nulli). Šis dizains ir teorētiski neregulāra, tas netika pieņemts paplašinātās regulārās izteiksmes sintaksē.
*
  • Zvaigzne pēc izteiksmes, kas atbilst vienai rakstzīmei, atbilst nulle vai vairāk kopijasšī (iepriekšējā) izteiksme. Piemēram, "*" atbilst tukšajai virknei, "x", "y", "zx", "zyx" utt.
  • \n*, Kur n ir cipars no 1 līdz 9, atbilst nullei vai vairākiem gadījumiem n atzīmētā apakšizteiksme. Piemēram, "\(a.\)c\1*" atbilst "abcab" un "abcaba", bet ne "abcac".

Izteiciens, kas ietverts burtos "\(" un "\)", kam seko "*", jāuzskata par nelikumīgu. Dažos gadījumos tas atbilst nullei vai vairākiem iekavās ietvertās virknes gadījumiem. Citos gadījumos tas atbilst izteicienam, kas ievietots iekavās, ņemot vērā rakstzīmi “*”.

\{x,y\} Atbilst pēdējam ( gaidāmo) bloks notiek vismaz x un ne vairāk y vienreiz. Piemēram, "a\(3,5\)" atbilst "aaa", "aaaa" vai "aaaaa". Atšķirībā no citiem operatoriem, šim operatoram (tradicionālajā sintaksē) ir nepieciešama slīpsvītra.
.* Jebkura rakstzīmju skaita apzīmējums starp divām regulāras izteiksmes daļām.

Metaraksti palīdz mums izmantot dažādas spēles. Bet kā mēs varam attēlot metarakstūru kā parastu rakstzīmi, tas ir, simbolu [ (kvadrātiekavu) ar kvadrātiekavas nozīmi? Tikai:

  • ir jābūt pirms ( vairogs) metaraksts (. * + \ ? ( )) atpakaļvērstā slīpsvītra. Piemēram \. vai \[

Lai vienkāršotu dažu rakstzīmju kopu definīciju, tās tika apvienotas t.s. rakstzīmju klases un kategorijas. POSIX ir standartizējis noteiktu rakstzīmju klašu un kategoriju deklarēšanu, kā parādīts šajā tabulā:

POSIX klase līdzīgi apzīmējums
[:augšējais:] lielajiem burtiem
[:zemāks:] mazie burti
[:alpha:] lielie un mazie burti
[:alnum:] cipariem, lielajiem un mazajiem burtiem
[:cipars:] cipariem
[:xdigit:] heksadecimālie cipari
[:punkts:] [.,!?:…] pieturzīmes
[:tukš:] [\t] atstarpe un TAB
[:atstarpe:] [\t\n\r\f\v] izlaist rakstzīmes
[:cntrl:] kontroles rakstzīmes
[:grafiks:] [^\t\n\r\f\v] zīmoga simboli
[:print:] [^\t\n\r\f\v] zīmoga simboli un izlaišanas simboli

Regulārajā izteiksmē ir tāda lieta kā:

Alkatība regulāra izteiksme

Es centīšos to aprakstīt pēc iespējas skaidrāk. Pieņemsim, ka mēs vēlamies atrast visu HTML tagi kādā tekstā. Pēc problēmas lokalizācijas mēs vēlamies atrast vērtības, kas atrodas starp< и >, kopā ar šīm pašām iekavām. Taču mēs zinām, ka tagiem ir dažāda garuma un pašu atzīmju ir vismaz 50. To visu uzskaitīšana, ievietošana metasimbolos ir pārāk laikietilpīgs uzdevums. Bet mēs zinām, ka mums ir izteiksme.* (punkta zvaigznīte), kas raksturo jebkuru rindā esošo rakstzīmju skaitu. Izmantojot dotā izteiksme mēģināsim atrast tekstā (

Tātad, Kā izveidot RAID līmenis 10/50 LSI MegaRAID kontrollerī (attiecas arī uz: Intel SRCU42x, Intel SRCS16):

) visas vērtības starp< и >. Rezultātā VISA rindiņa atbildīs šai izteiksmei. kāpēc, jo regulārais izteiksmes veids ir ALTĪGS un mēģina tvert JEBKURU rakstzīmju skaitu starp< и >, attiecīgi visa līnija, sākot < p> Tātad... un beidzas ...> piederēs šim noteikumam!

Es ceru, ka šis piemērs skaidri parāda, kas ir alkatība. Lai atbrīvotos no šīs alkatības, varat iet šādu ceļu:

  • ņem vērā simbolus Nav kas atbilst vēlamajam modelim (piemēram:<[^>]*> iepriekšminētajam gadījumam)
  • atbrīvojieties no alkatības, pievienojot kvantatora definīciju kā ne-mantkārīgs:
    • *? - "nav mantkārīgs" ("slinks") ekvivalents *
    • +? - “nav mantkārīgs” (“slinks”) ekvivalents +
    • (n,)? - “nav mantkārīgs” (“slinks”) ekvivalents (n,)
    • .*? - “nav mantkārīgs” (“slinks”) ekvivalents.*

Es vēlētos papildināt visu iepriekš minēto paplašinātās regulārās izteiksmes sintakse:

Regulārās izteiksmes POSIX ir līdzīgas tradicionālajai Unix sintaksei, taču ir pievienotas dažas metarakstzīmes:

Plus norāda uz to iepriekšējā simbols vai grupai var atkārtot vienu vai vairākas reizes. Atšķirībā no zvaigznītes, ir nepieciešams vismaz viens atkārtojums.

Jautājuma zīme dara iepriekšējā simbols vai grupa nav obligāta. Citiem vārdiem sakot, attiecīgajā rindā tas var nebūt vai klāt gluda viens vienreiz.

Vertikālā josla sadala alternatīvas iespējas regulāras izteiksmes. Viena rakstzīme norāda divas alternatīvas, taču to var būt vairāk, vienkārši izmantojiet vairāk vertikālo joslu. Ir svarīgi atcerēties, ka šis operators izmanto pēc iespējas vairāk izteiksmes. Šī iemesla dēļ alternatīvais operators visbiežāk tiek izmantots iekavās.

Ir atcelta arī slīpsvītru lietošana: \(…\) kļūst par (…) un \(…\) kļūst par (…).

Noslēdzot ziņu, es sniegšu dažus regex izmantošanas piemērus:

$ kaķa teksts1 1 ābols 2 bumbieris 3 banāns $ grep p teksts1 1 ābols 2 bumbieris $ grep "pp*" teksts1 1 ābols 2 bumbieris $ kaķis teksts1 | grep "l\|n" 1 ābols 3 banāns $ echo -e "atrast\n* šeit" | grep "\*" * šeit $ grep "pl\?.*r" text1 # p, rindās, kur ir r 2 bumbieris $ grep "a.." text1 # rindas ar a, kam seko vismaz 2 rakstzīmes 1 apple 3 banana $ grep "" text1 # meklēt rindas, kurās ir 3 vai p 1 apple 2 pear 3 banana $ echo -e "atrast\n* šeit\nkaut kur." | grep "[.*]" * šeit kaut kur..nosaukums]$ echo -e "123\n456\n789\n0" | grep "" 123 456 789 $ sed -e "/\(a.*a\)\|\(p.*p\)/s/a/A/g" text1 # aizstāt a ar A visās rindās, kur pēc a nāk a vai pēc p nāk p 1 Ābols 2 bumbieris 3 bAnAnA *\./ PĒDĒJAIS VĀRDS./g" Pirmais. PĒDĒJAIS VĀRDS. Tas ir PĒDĒJAIS VĀRDS.

Ar cieņu, McSim!

grep apzīmē "globālās regulārās izteiksmes printeris". grep nogriež vajadzīgās līnijas teksta faili kas satur lietotāja norādītu tekstu.

grep var izmantot divos veidos - atsevišķi vai kombinācijā ar straumēm.

grep ir ļoti plaša funkcionalitāte, jo tas atbalsta daudzo opciju skaitu, piemēram: meklēšanu, izmantojot virknes modeli vai RegExp regulārās izteiksmes modeli vai uz perl balstītas regulāras izteiksmes utt.

Sakarā ar tās atšķirīgo funkcionalitāte Grep rīkam ir daudz iespēju, tostarp egrep (paplašinātais GREP), fgrep (Fiksēts GREP), pgrep (apstrādāt GREP), rgrep (rekursīvs GREP) utt. Taču šīm opcijām ir nelielas atšķirības no sākotnējās grep.

grep opcijas

$ grep -V grep (GNU grep) 2.10 Autortiesības (C) 2011 Free Software Foundation, Inc. Licence GPLv3+

Ir arī grep utilīta modifikācijas: egrep (ar paplašinātu regulārās izteiksmes apstrādi), fgrep (kas apstrādā $*^|()\ simbolus kā literāļus, t.i., burtiski), rgrep (ar iespējotu rekursīvo meklēšanu).

    egrep ir tāds pats kā grep -E

    fgrep ir tāds pats kā grep -F

    rgrep ir tāds pats kā grep -r

    grep [-b] [-c] [-i] [-l] [-n] [-s] [-v] ierobežots_regex_BRE [fails...]

Komanda grep saskaņo rindas avota failos ar ierobežoto_regex norādīto modeli. Ja faili nav norādīti, tiek izmantota standarta ievade. Parasti katra veiksmīgi saskaņotā virkne tiek kopēta standarta izvadē; ja ir vairāki avota faili, faila nosaukums tiek norādīts pirms atrastās rindas. grep izmanto kompaktu, nedeterministisku algoritmu. Ierobežotas regulārās izteiksmes (izteiksmes, kurām ir rakstzīmju virknes ar to nozīmi un kurās tiek izmantots ierobežots burtciparu un speciālo rakstzīmju kopums) tiek uztvertas kā veidnes. Tiem ir tāda pati nozīme kā regulārām izteiksmēm izdevumā.

Lai izvairītos no rakstzīmēm $, *, , ^, |, () un \ no čaulas interpretācijas, visvieglāk ir iekļaut constrained_regex atsevišķās pēdiņās.

Iespējas:

B Katrai rindai ievada bloka numuru, kurā tā tika atrasta. Tas var būt noderīgi, meklējot blokus pēc konteksta (bloki tiek numurēti, sākot no 0). -c Drukā tikai to rindu skaitu, kurās ir raksts. -h Neļauj izdrukāt faila nosaukumu, kurā ir atbilstošā rinda, pirms pašas rindas. Izmanto, meklējot vairākos failos. -i Ignorē reģistru, veicot salīdzinājumus. -l Drukā tikai to failu nosaukumus, kas satur atbilstošās virknes, pa vienam katrā rindā. Ja raksts tiek atrasts vairākās faila rindās, faila nosaukums netiek atkārtots. -n Pirms katras rindiņas izdrukā tās numuru failā (rindas tiek numurētas, sākot no 1). -s Izslēdz ziņojumus par neesošiem vai nelasāmiem failiem. -v Drukā visas līnijas, izņemot tās, kurās ir raksts. -w Meklē izteicienu kā vārdu, it kā to ieskauj metarakstzīmes \< и \>.

grep - palīdzība

Lietojums: grep [OPTION]... PATTERN [FILE]... Meklē PATTERN katrā FILE vai standarta ievadē. Pēc noklusējuma PATTERN ir vienkārša regulārā izteiksme (BRE). Piemērs: grep -i "sveika pasaule" menu.h main.c Regulārās izteiksmes veida izvēle un tās interpretācija: -E, --extended-regexp PATTERN - paplašināta regulārā izteiksme (ERE) -F, --fixed-regexp PATTERN - virknes fiksēta garuma, atdalītas ar jaunrindas rakstzīmi -G, --basic-regexp PATTERN - vienkārša regulārā izteiksme (BRE) -P, --perl-regexp PATTERN - Perl regulārās izteiksmes -e, --regexp=PATTERN izmantojiet PATTERN, lai meklēt - f, --file=FILE ņemt PATTERN no FILE -i, --ignore-case ignorēt reģistru atšķirību -w, --word-regexp PATTERN jāatbilst visiem vārdiem -x, --line-regexp PATTERN jāatbilst visai rindai -z, --null-data rindas ir atdalītas ar nulles baitu, nevis ar rindiņas beigu rakstzīmi. Dažādi: -s, --no-messages nomāc kļūdu ziņojumus -v, --revert-match atlasiet nesaskaņotas rindas -V, - - versija drukāt versijas informāciju un iziet --help parādīt šo palīdzību un iziet --mmap for atpakaļejoša saderība, ignorēts Izvades vadīkla: -m, --max-count=NUMBER stop pēc norādītā atbilstības SKAITS -b, --byte-offset izdrukā baitu nobīdi kopā ar izvades rindām -n, --line-number izdrukā rindu numurs kopā ar izvades rindām --line-buffered izskalojiet buferi pēc katras rindas -H, --with-filename izdrukājiet faila nosaukumu katrai atbilstībai -h, --no-filename nesāciet izvadi ar faila nosaukumu -- label=LABEL izmantojiet LABEL kā faila nosaukumu standarta ievadei -o, --only-matching rādīt tikai daļu no rindas, kas atbilst PATTERN -q, --quiet, --silent apspiest visu parasto izvadi --binary-files=TYPE pieņemt ka binārais fails ir TIPS: binārs, teksts vai bez atbilstības. -a, --teksts tāds pats kā --binary-files=teksts -I tāpat kā --binary-files=without-match -d, --directories=ACTION kā rīkoties ar direktorijiem DARBĪBU var lasīt ), atkārtot (rekursīvi) vai izlaist (izlaist). -D, --devices=DARBĪBA kā rīkoties ar ierīcēm, FIFO un ligzdām ACTION var lasīt vai izlaist -R, -r, --rekursīvs tāpat kā --directories=recurse --include=F_PATTERN apstrādāt tikai failus, kas atbilst zem F_TEMPLATE - -exclude=F_TEMPLATE izlaist failus un direktorijus, kas atbilst F_TEMPLATE --exclude-from=FILE izlaist failus, kas atbilst veidņu failiem no FILE --exclude-dir=TEMPLATE direktoriji, kas atbilst PATTERN tiks izlaisti -L, - -faili-bez-atbilst tikai drukāšanai FILE nosaukumi bez atbilstības -l, --files-with-matches drukā tikai FILE nosaukumus ar atbilstībām -c, --count drukā tikai atbilstošo rindu skaitu vienam FILE -T, --sākotnējā-tabulēšanas līdzināšanas cilne (ja nepieciešams) - Z, --null drukas baits 0 aiz FAILA nosaukuma Konteksta pārvaldība: -B, --befor-context=NUM drukāt iepriekšējā konteksta rindu SKAITUS -A, --af-context=NUM izdrukāt rindiņu SKAITS nākamais konteksts -C, --context[=NUMBER] izdrukāt konteksta rindiņu SKAITS -NUMBER ir tāds pats kā --context=NUMBER --color[=WHEN], --colour[=WHEN] izmantojiet marķierus, lai atšķirtu atbilstību līnijas; WHEN var būt vienmēr, nekad vai auto -U, --binary nenoņemt CR rakstzīmes rindas beigās (MSDOS) -u, --unix-baitu nobīdes parāda nobīdi tā, it kā CR-s nebūtu (MSDOS). ) Vārda “egrep” vietā ir paredzēts palaist “grep -E”. "fgrep" vietā tiek pieņemts "grep -F". Labāk nav palaist kā “egrep” vai “fgrep”. Ja FILE nav norādīts vai FILE ir -, tiek nolasīta standarta ievade. Ja ir norādīti mazāk nekā divi faili, tiek pieņemts -h. Ja tiek atrasta atbilstība, izejas kods būs 0 un 1, ja nē. Ja rodas kļūdas vai ja opcija -q nav norādīta, izejas kods būs 2. Ziņojiet par kļūdām uz: Lūdzu, ziņojiet par kļūdām tulkojumā uz: GNU Grep mājas lapa: Palīdzība darbam ar GNU programmām: