Regulaaravaldised: erinevus redaktsioonide vahel
P omavigaparandus |
|||
| (ei näidata 3 kasutaja 6 vahepealset redaktsiooni) | |||
| 1. rida: | 1. rida: | ||
===Regulaaravaldised=== | ===Regulaaravaldised=== | ||
| 6. rida: | 5. rida: | ||
Kasutame regulaaravaldiste selgitamise näidetes programmi Egrep, kuna ta saab aru ka suhteliselt keerulistest regulaaravaldistest. | Kasutame regulaaravaldiste selgitamise näidetes programmi Egrep, kuna ta saab aru ka suhteliselt keerulistest regulaaravaldistest. | ||
Toome lihtsa näite | Toome lihtsa näite - fail kalastus: | ||
bash$ cat kalastus | bash$ cat kalastus | ||
| 25. rida: | 24. rida: | ||
Regulaaravaldis "_.$" klapib nende ridadega, mille lõpus ($) on kõrvuti alakriips ja üks suvaline märk (_.). | Regulaaravaldis "_.$" klapib nende ridadega, mille lõpus ($) on kõrvuti alakriips ja üks suvaline märk (_.). | ||
Regulaaravaldiste oskuslik kasutamine on oluline muuhulgas selliste programmide nagu Sed, Awk ja Procmail puhul. | |||
===Literaalsed - ja metasümbolid=== | ===Literaalsed - ja metasümbolid=== | ||
| 31. rida: | 30. rida: | ||
Regulaaravaldis "_.$" sisaldab kahte sorti sümboleid: | Regulaaravaldis "_.$" sisaldab kahte sorti sümboleid: | ||
* literaalsed - need, mis ise esinevad vaatlusaluses tekstis, nagu alakriips | |||
* metasümbolid - "." kohal võib olla üks suvaline tähemärk; "$" tähistab rea lõppu. | |||
Regulaaravaldised võeti algselt kasutusele programmis Ed, millest kasvasid välja Grep ja Sed. Piiratud metasümbolite arv, mida nimetatakse traditsiooniliseks metasümbolite hulgaks, tingis laiendatud metasümbolite hulga (ingl. k. extended metacharacters set) kasutuselevõtu. Laiendatud hulka oskavad kasutada Awk ja Egrep. | Regulaaravaldised võeti algselt kasutusele programmis Ed, millest kasvasid välja Grep ja Sed. Piiratud metasümbolite arv, mida nimetatakse traditsiooniliseks metasümbolite hulgaks, tingis laiendatud metasümbolite hulga (ingl. k. extended metacharacters set) kasutuselevõtu. Laiendatud hulka oskavad kasutada Awk ja Egrep. | ||
| 40. rida: | 39. rida: | ||
===Traditsioonilised metasümbolid=== | ===Traditsioonilised metasümbolid=== | ||
* . - punkt: suvaline üks sümbol | |||
* * - tärn: suvaline arv, sh 0 temast vasakule jäävat sümbolit | |||
* [...] - klass: üks kantsulgude vahel olevatest sümbolitest | |||
* ^ - katus: rea algus | |||
* $ - dollar: rea lõpp | |||
* \ - tagurpidi kaldkriips: varjestab talle järgneva metasümboli. | |||
Järgnevad näited sellise teksti alusel: | Järgnevad näited sellise teksti alusel: | ||
| 51. rida: | 50. rida: | ||
bash~$ cat kohad | bash~$ cat kohad | ||
Tartu 1437 | Tartu 1437 | ||
Helsinki 1960 | |||
Yellowstone 1903 | Yellowstone 1903 | ||
Tokio 1990 | Tokio 1990 | ||
| 57. rida: | 56. rida: | ||
Pariis 1500 | Pariis 1500 | ||
Kahekümnenda sajandi aastaarvud: | |||
bash~$ egerp "19.." kohad | bash~$ egerp "19.." kohad | ||
Kõik read | |||
bash~$ egrep ".*" kohad | bash~$ egrep ".*" kohad | ||
Kõik i või e -lõpuliste kohanimedega read: | |||
bash~$ grep "[ie] " kohad | bash~$ grep "[ie] " kohad | ||
Kõik read kus kohanimi ei lõppe i või e tähega: | |||
bash~$ grep "[^ie] " kohad | bash~$ grep "[^ie] " kohad | ||
| 75. rida: | 74. rida: | ||
Klassis omab ^ märk inverteerivat tähendust, st klapivad need read, kui tühikule ei eelne i või e. | Klassis omab ^ märk inverteerivat tähendust, st klapivad need read, kui tühikule ei eelne i või e. | ||
T -ga algavad viietähelise kohanimega read: | |||
bash~$ egrep "^T.... " kohad | bash~$ egrep "^T.... " kohad | ||
Sajandivahetusele vastavad kohad: | |||
bash~$ egrep "00$" kohad | bash~$ egrep "00$" kohad | ||
Read, milles esineb sümbol "^": | |||
bash~$ egrep "\^" kohad | bash~$ egrep "\^" kohad | ||
| 91. rida: | 90. rida: | ||
Laiendatud metasümbolite hulka kuuluvad lisaks traditsioonilistele järgmised metasümbolid: | Laiendatud metasümbolite hulka kuuluvad lisaks traditsioonilistele järgmised metasümbolid: | ||
* + - pluss: üks või enam temast vasakul olevat sümbolit | |||
* ? - küsimärk: null või üks temast vasakul olevat sümbolit | |||
* | - toru: eelnev või järgnev regulaaravaldis | |||
* () - sulud: grupeerib regulaaravaldisi | |||
* {n,m} - loogad: mitu eelnevat sümbolit | |||
Näited eelpool toodud teksti alusel: | Näited eelpool toodud teksti alusel: | ||
Kõik selle sajandile vastavad e -ga lõppevad kohanimed: | |||
bash~$ egrep "e +19" kohad | bash~$ egrep "e +19" kohad | ||
Kohanimi võib olla kirjutatud kokku või sisaldada sidekriipsu: | |||
bash~$ egrep "Jää-?äär" kohad | bash~$ egrep "Jää-?äär" kohad | ||
| 128. rida: | 127. rida: | ||
bash~$ egrep -E "a{4}" kohad | bash~$ egrep -E "a{4}" kohad | ||
Null kuni neli 'a' -d: | |||
bash~$ egrep -E "a{,4}" kohad | bash~$ egrep -E "a{,4}" kohad | ||
===Perl sarnaste avaldiste kasutamine=== | |||
Logist sarnase rea tabamiseks | |||
Jan 10 23:49:46 post-relay postfix/smtp[15560]: 5A9CA5FD4E: to=<imre@auul.pri.ee> ... | |||
sobib öelda nt | |||
$ grep -P "postfix/smtp\[[0-9]+\]: [0-9,A-Z]+:" /var/log/mail.log | |||
===Mõned regexpi mustrid=== | ===Mõned regexpi mustrid=== | ||
| 146. rida: | 155. rida: | ||
[0-9]+ - vähemalt 1 number | [0-9]+ - vähemalt 1 number | ||
Rida httpd logist | |||
OUTPUT="HTTP OK HTTP/1.0 200 OK - 3376 bytes in 0.093 seconds" | OUTPUT="HTTP OK HTTP/1.0 200 OK - 3376 bytes in 0.093 seconds" | ||
Selle analoogia põhjal proovi | Selle analoogia põhjal proovi avaldist: | ||
"output:tm:/- (\\d+) bytes/" "output:tma:/in = (\\d+\\.?\\d*) seconds/" | "output:tm:/- (\\d+) bytes/" "output:tma:/in = (\\d+\\.?\\d*) seconds/" | ||
Nimelt, kuna originaalis ilmselt on kirjutatud \\d, siis tähendab see, et \ tuleb veel topelt | Nimelt, kuna originaalis ilmselt on kirjutatud \\d, siis tähendab see, et \ tuleb veel topelt varjestada, ehk \\, millest võis minu esialgne rida mitte töötada. Teine asi on nende sulgudega - sulgude sees olev regexi osa on see, mis pannakse väljundisse, seega peab sulge õigesti panema. | ||
===Kasulikud lisamaterjalid=== | ===Kasulikud lisamaterjalid=== | ||
Sed | * [[:Sed]] | ||
Awk | * [[:Awk]] | ||
Procmail | * [[:Procmail]] | ||
© EENet 2000 | © EENet 2000 | ||
Viimane redaktsioon: 29. detsember 2025, kell 02:56
Regulaaravaldised
Regulaaravaldis on kontrolleeskiri, mida rakendatakse mingile tekstile. Iga teksti jaoks antakse vastus, kas tekst klappis avaldisega või mitte.
Kasutame regulaaravaldiste selgitamise näidetes programmi Egrep, kuna ta saab aru ka suhteliselt keerulistest regulaaravaldistest.
Toome lihtsa näite - fail kalastus:
bash$ cat kalastus tegelane kalade arv Priit_______1 Mart_______12 Peeter_____45 Konstant___34 Tibu________3 Miima______12
Eraldame välja read, kus on kalade arv alla kümne. See tähendab, rea lõpus asuv kalade arv on pandud kirja ühe märgiga.
bash$ egrep "_.$" kalastus Priit_______1 Tibu________3
Regulaaravaldis "_.$" klapib nende ridadega, mille lõpus ($) on kõrvuti alakriips ja üks suvaline märk (_.).
Regulaaravaldiste oskuslik kasutamine on oluline muuhulgas selliste programmide nagu Sed, Awk ja Procmail puhul.
Literaalsed - ja metasümbolid
Regulaaravaldis "_.$" sisaldab kahte sorti sümboleid:
- literaalsed - need, mis ise esinevad vaatlusaluses tekstis, nagu alakriips
- metasümbolid - "." kohal võib olla üks suvaline tähemärk; "$" tähistab rea lõppu.
Regulaaravaldised võeti algselt kasutusele programmis Ed, millest kasvasid välja Grep ja Sed. Piiratud metasümbolite arv, mida nimetatakse traditsiooniliseks metasümbolite hulgaks, tingis laiendatud metasümbolite hulga (ingl. k. extended metacharacters set) kasutuselevõtu. Laiendatud hulka oskavad kasutada Awk ja Egrep.
Aritmeetiliste avaldiste juures on olulised tehtemärgid. Regulaaravaldistes on põhiliseks teheteks sümbolite kõrvutiolek.
Traditsioonilised metasümbolid
- . - punkt: suvaline üks sümbol
- * - tärn: suvaline arv, sh 0 temast vasakule jäävat sümbolit
- [...] - klass: üks kantsulgude vahel olevatest sümbolitest
- ^ - katus: rea algus
- $ - dollar: rea lõpp
- \ - tagurpidi kaldkriips: varjestab talle järgneva metasümboli.
Järgnevad näited sellise teksti alusel:
bash~$ cat kohad Tartu 1437 Helsinki 1960 Yellowstone 1903 Tokio 1990 Praha 1400 Pariis 1500
Kahekümnenda sajandi aastaarvud:
bash~$ egerp "19.." kohad
Kõik read
bash~$ egrep ".*" kohad
Kõik i või e -lõpuliste kohanimedega read:
bash~$ grep "[ie] " kohad
Kõik read kus kohanimi ei lõppe i või e tähega:
bash~$ grep "[^ie] " kohad
Klassis omab ^ märk inverteerivat tähendust, st klapivad need read, kui tühikule ei eelne i või e.
T -ga algavad viietähelise kohanimega read:
bash~$ egrep "^T.... " kohad
Sajandivahetusele vastavad kohad:
bash~$ egrep "00$" kohad
Read, milles esineb sümbol "^":
bash~$ egrep "\^" kohad
Laiendatud metasümbolite kirjeldused
Laiendatud metasümbolite hulka kuuluvad lisaks traditsioonilistele järgmised metasümbolid:
- + - pluss: üks või enam temast vasakul olevat sümbolit
- ? - küsimärk: null või üks temast vasakul olevat sümbolit
- | - toru: eelnev või järgnev regulaaravaldis
- () - sulud: grupeerib regulaaravaldisi
- {n,m} - loogad: mitu eelnevat sümbolit
Näited eelpool toodud teksti alusel: Kõik selle sajandile vastavad e -ga lõppevad kohanimed:
bash~$ egrep "e +19" kohad
Kohanimi võib olla kirjutatud kokku või sisaldada sidekriipsu:
bash~$ egrep "Jää-?äär" kohad
Võib alata C või K'ga:
bash~$ egrep "K|Columbia" kohad
Kui tavaliselt toimivad metasümbolid ühele eelnevale või järgnevale märgile, siis sulgudega on võimalik nad panna toimima mitmele:
bash~$ egrep "(Columbia)|(Kolumbia)" kohad
Võimalik on näidata, mitu sümbolit lähevad arvesse:
Neli kuni seitse 'a' -d:
bash~$ egrep -E "a{4,7}" kohad
Neli või enam 'a' -d:
bash~$ egrep -E "a{4,}" kohad
Täpselt neli 'a' -d:
bash~$ egrep -E "a{4}" kohad
Null kuni neli 'a' -d:
bash~$ egrep -E "a{,4}" kohad
Perl sarnaste avaldiste kasutamine
Logist sarnase rea tabamiseks
Jan 10 23:49:46 post-relay postfix/smtp[15560]: 5A9CA5FD4E: to=<imre@auul.pri.ee> ...
sobib öelda nt
$ grep -P "postfix/smtp\[[0-9]+\]: [0-9,A-Z]+:" /var/log/mail.log
Mõned regexpi mustrid
as 112233 sdf asd 0.0232 ads
Muster: \s(0\.)?[0-9]+\s
Selgitus:
\s - tühik (0\.)? - luba numbrijada ees 0. [0-9]+ - vähemalt 1 number
Rida httpd logist
OUTPUT="HTTP OK HTTP/1.0 200 OK - 3376 bytes in 0.093 seconds"
Selle analoogia põhjal proovi avaldist:
"output:tm:/- (\\d+) bytes/" "output:tma:/in = (\\d+\\.?\\d*) seconds/"
Nimelt, kuna originaalis ilmselt on kirjutatud \\d, siis tähendab see, et \ tuleb veel topelt varjestada, ehk \\, millest võis minu esialgne rida mitte töötada. Teine asi on nende sulgudega - sulgude sees olev regexi osa on see, mis pannakse väljundisse, seega peab sulge õigesti panema.
Kasulikud lisamaterjalid
© EENet 2000