Regex bash regulaaravaldised. Viis näidet grepi kasutamisest. Basha keele süntaktilised aspektid

Selle õpetuse kohta

Tere tulemast põhihaldusse, teise neljast õpetusest, mis on mõeldud teid Linuxi professionaalse instituudi eksamiks 101 ette valmistama. Selles osas vaatleme, kuidas kasutada regulaaravaldisi mustrite abil failides teksti otsimiseks. Järgmisena tutvustatakse teile failisüsteemi hierarhia standardit (FHS) ja ühtlasi näitame teile, kuidas oma süsteemist vajalikke faile leida. Pärast seda saate teada, kuidas Linuxis protsesse täielikult juhtida, käivitades neid taustal, vaadates protsesside loendit, eraldades need terminalist ja palju muud. Järgnev on kiire tutvustus torujuhtmete, ümbersuunamiste ja tekstitöötluskäskude kohta. Lõpuks tutvustame teile Linuxi tuumamooduleid.

Eelkõige sobib see õpetuse osa (2. osa) ideaalselt neile, kellel on juba head bashi algteadmised ja kes soovivad saada hea sissejuhatuse Linuxi halduse põhiülesannetesse. Kui olete Linuxi kasutaja uus, soovitame teil esmalt lõpetada selle juhendite seeria 1. osa. Kuigi suur osa sellest materjalist on mõne jaoks uus, võivad kogenumad Linuxi kasutajad pidada seda suurepäraseks viisiks oma põhiliste haldusoskuste kokkuvõtmiseks.



Kui õppisite selle õpetuse esimest väljaannet muul eesmärgil kui LPI eksamiks valmistumisel, ei pea te võib-olla seda väljaannet uuesti lugema. Kui aga plaanite eksamit sooritada, on teil tungivalt soovitatav see õpetuse muudetud versioon uuesti läbi lugeda.

Regulaaravaldised

Mis on "tavaline avaldis"?

Regulaaravaldis on spetsiaalne süntaks, mida kasutatakse tekstimustrite kirjeldamiseks. Linuxi süsteemides kasutatakse regulaaravaldisi laialdaselt tekstist mustrite otsimiseks, samuti tekstivoogude otsimiseks ja asendamiseks.

Võrreldes maakeramisega

Kui hakkame regulaaravaldisi vaatama, võite märgata, et nende süntaks on väga sarnane 1. osas vaadeldud globbing süntaksiga. Kuid ärge eksige, see sarnasus on väga pealiskaudne. Regulaaravaldised ja gloobusmustrid, isegi kui nad näevad välja sarnased, on põhimõtteliselt erinevad asjad.

Lihtne alamstring

Selle hoiatusega vaatleme regulaaravaldiste kõige elementaarsemat asja, kõige lihtsamat alamstringi. Selleks kasutame "grep" - käsku, mis kontrollib faili sisu vastavalt etteantud regulaaravaldisele. grep prindib iga regulaaravaldisele vastava rea, ignoreerides ülejäänud:

$ grep bash /etc/passwd
operaator:x:11:0:operaator:/root:/bin/bash root:x:0:0::/root:/bin/bash ftp:x:40:1::/home/ftp:/bin/ bash

Eespool on grep-i esimene parameeter regex; teine ​​on faili nimi. grep loe iga rida alates /etc/passwd ja rakendas sellele vaste otsimiseks lihtsat "bash" regexi alamstringi. Kui leiti vaste, printis grep terve rea; vastasel juhul joont eirati.

Lihtsa alamstringi mõistmine

Üldiselt, kui otsite alamstringi, saate selle lihtsalt sõna-sõnalt täpsustada, ilma "erimärke" kasutamata. Peate olema eriti ettevaatlik ainult siis, kui teie alamstring sisaldab +, ., *, [, ] või \. Sel juhul tuleb need märgid kasutada kaldkriipsuga ja alamstring jutumärkides. Siin on mõned näited regulaaravaldistest lihtsa alamstringina:

  • /tmp (otsi stringi /tmp)
  • "\" (stringiotsing)
  • "\*naljakas\*" (otsi stringi *naljakas*)
  • "ld\.so" (otsi stringi ld.so)

Metategelased

Regulaaravaldiste abil on metamärke kasutades võimalik sooritada palju keerulisemaid otsinguid kui hiljuti vaadeldud näidetes. Üks selline metamärk on "." (punkt), mis vastab mis tahes üksikule märgile:

$ grep dev.sda /etc/fstab
/dev/sda3 / reiserfs noatime,ro 1 1 /dev/sda1 /boot reiserfs noauto,noatime,notail 1 2 /dev/sda2 swap swap sw 0 0 #/dev/sda4 /mnt/extra reiserfs noatime,rw 1 1

Selles näites ei esine teksti dev.sda sõna otseses mõttes ühelgi real alates /etc/fstab. Kuid grep skannib seda mitte sõna otseses mõttes dev.sda rea, vaid dev.sda mustri järgi. Mäleta seda "." sobib ühele tähemärgile. Nagu näete, on metamärk "." on funktsionaalselt samaväärne sellega, kuidas metamärk "?" globu asendustes.

Kasutamine

Kui tahame olla märgi kohta täpsemad kui "." teeb, saame kasutada [ ja ] (nurksulgud), et määrata sobiv märkide alamhulk:

$ grep dev.sda /etc/fstab
/dev/sda1 /boot reiserfs noauto,noatime,notail 1 2 /dev/sda2 swap swap sw 0 0

Nagu märkasite, toimib see süntaktiline konstruktsioon failinimede globaalsel asendamisel identselt konstruktsiooniga "". See on jällegi üks ebaselgusi regulaaravaldiste õppimisel: süntaks on sarnane, kuid mitte identne glob-asenduste süntaksiga, mis tekitab segadust.

Kasutades [^]

Te saate nurksulgude tähenduse ümber pöörata, kui asetate ^ vahetult pärast [. Sel juhul vastavad sulud kõikidele märkidele, mida nende sees EI OLE loetletud. Ja jälle, pange tähele, et me kasutame [^] regulaaravaldisega ja [!] maakeraga:

$ grep dev.hda[^12] /etc/fstab
/dev/hda3 / reiserfs noatime,ro 1 1 #/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1

Erinev süntaks

On väga oluline märkida, et nurksulgude sees olev süntaks erineb põhimõtteliselt ülejäänud regulaaravaldisest. Näiteks kui paned "." nurksulgude sees võimaldab see nurksulgudel vastendada "." sõna otseses mõttes, täpselt nagu ülaltoodud näites 1 ja 2. Võrdluseks, "." nurksulgudest väljapoole paigutatud väärtust tõlgendatakse metatähemärgina, välja arvatud juhul, kui lisatakse "\". Saame seda asjaolu ära kasutada, et väljastada failist /etc/fstab read, mis sisaldavad rida dev.sda, nagu on kirjutatud:

$ grep dev[.]sda /etc/fstab

Samuti võime kirjutada:

$ grep "dev\.sda" /etc/fstab

Need regulaaravaldised ei vasta tõenäoliselt ühelegi teie reale. /etc/fstab faili.

Matasümbol *

Mõned metategelased ei sobi ise millegagi, vaid muudavad eelmise tähemärgi tähendust. Üks selline märk on * (tärn), mida kasutatakse eelneva märgi nulli või enama korduse sobitamiseks. Pange tähele, et see tähendab, et * omab regexis teist tähendust kui globimises. Siin on mõned näited ja pöörake erilist tähelepanu juhtudele, kus regulaaravaldise sobitamine erineb glob-asendustest:

  • ab*c vastab "abbbbc", kuid mitte "abqc" (glob-asenduse korral sobivad mõlemad stringid mustriga. Kas saate veel aru, miks?)
  • ab*c vastab "abc", kuid mitte "abbqbbc" (jällegi, glob-asendusega sobib muster mõlemale stringile)
  • ab*c vastab "ac", kuid mitte "cba" (globbing'i puhul ei "ac" ega "cba" ei vasta mustrile)
  • b*e vastab "bqe" ja "be" (glob asendus vastab "bqe", kuid mitte "be")
  • b*e vastab "bccqqe", kuid mitte "bccc" (globimisel vastab muster täpselt esimesele, kuid mitte teisele)
  • b*e vastab "bqqcce", kuid mitte "cqe" (sama glob asendusega)
  • b*e rahuldab "bbbeee" (kuid mitte globimise korral)
  • .* võrreldav mis tahes stringiga (glob-asendust rahuldavad ainult stringid, mis algavad tähega ".")
  • foo.* sobib mis tahes alamstringiga, mis algab tähega "foo" (glob-asenduse korral sobib see muster stringidega, mis algavad nelja märgiga "foo".)

Niisiis, kordame tugevdamiseks: rida "ac" sobib regulaaravaldisega "ab*c", kuna tärn lubab ka eelmist avaldist (b) korrata null korda. Ja jällegi on oluline märkida, et * metamärki regulaaravaldistes tõlgendatakse täiesti erinevalt kui * märki glob-asendustes.

Rea algus ja lõpp

Viimased metamärgid, mida me üksikasjalikult vaatleme, on ^ ja $, mida kasutatakse vastavalt stringi alguse ja lõpu sobitamiseks. Kasutades ^-d oma regexi alguses, "ankurdate" oma mustri rea algusesse. Järgmises näites kasutame regulaaravaldist ^#, mis sobib mis tahes stringiga, mis algab tähega #:

$ grep ^# /etc/fstab

#

Täisrea püsikliendid

^ ja $ saab kombineerida, et need sobiksid kogu stringiga. Näiteks vastab järgmine regulaaravaldis ridadele, mis algavad tähemärgiga # ja lõpevad märgiga ", kusjuures nende vahel on suvaline arv märke:

$ grep "^#.*\.$" /etc/fstab
# /etc/fstab: staatiline failisüsteemi teave.

Ülaltoodud näites panime oma regulaaravaldise ühekordsetesse jutumärkidesse, et takistada kestal tähemärki $ tõlgendamast. Ilma üksikute jutumärkideta kaoks $ meie regexist enne, kui grep seda üldse näha saaks.

Autorite kohta

Daniel Robbins

Daniel Robbins on Gentoo kogukonna asutaja ja Gentoo Linuxi operatsioonisüsteemi looja. Daniel elab New Mexicos koos oma naise Mary ja kahe energilise tütrega. Ta on ka Funtoo asutaja ja tegevjuht ning kirjutanud arvukalt tehnilisi artikleid ajakirjadele IBM developerWorks, Intel Developer Services ja C/C++ Users Journal.

Chris Houser

Chris Houser on olnud UNIX-i advokaat aastast 1994, mil ta liitus Taylori ülikooli (Indiana, USA) administratiivmeeskonnaga, kus ta omandas bakalaureusekraadi arvutiteaduses ja matemaatikas. Pärast seda on ta töötanud erinevates valdkondades, sealhulgas veebirakenduste, videotöötluse, UNIX-draiverite ja krüptoturbe alal. Töötab praegu ettevõttes Sentry Data Systems. Chris on panustanud ka paljudesse tasuta projektidesse, nagu Gentoo Linux ja Clojure, ning olnud raamatu The Joy of Clojure kaasautor.

Aron Griffis

Aaron Griffis elab Bostoni piirkonnas, kus ta on viimase kümnendi Hewlett-Packardis töötanud selliste projektidega nagu UNIX-i võrgudraiverid Tru64 jaoks, Linuxi turvasertifikaat, Xeni ja KVM-i virtualiseerimine ning viimati HP ePrinti platvorm. Kui ta programmeerimisega ei tegele, meeldib Aaronile mõelda programmeerimisprobleemidele rattaga sõites, kurikatega žongleerides või Boston Red Soxi professionaalses pesapallimeeskonnas rõõmustades.

grep tähistab 'globaalse regulaaravaldise printerit'. grep lõikab vajalikud read tekstifailidest, mis sisaldavad kasutaja määratud teksti.

grep'i saab kasutada kahel viisil – eraldi või koos voogudega.

grep on funktsionaalsuselt väga lai, kuna see toetab palju võimalusi, näiteks otsimine stringimustri või RegExp regulaaravaldise mustri või perlipõhiste regulaaravaldiste abil jne.

Erineva funktsionaalsuse tõttu on grepi tööriistal palju variante, sealhulgas egrep (laiendatud GREP), fgrep (parandatud GREP), pgrep (GREP-i töötlemine), rgrep (rekursiivne GREP) jne. Kuid neil valikutel on algsest grepist väikesed erinevused.

grep valikud

$ grep -V grep (GNU grep) 2.10 Autoriõigus (C) 2011 Free Software Foundation, Inc. Litsents GPLv3+

Utiliidis grep on modifikatsioonid: egrep (laiendatud regulaaravaldise töötlemisega), fgrep (mis käsitleb $*^|()\ sümboleid literaalidena, st sõna otseses mõttes), rgrep (rekursiivse otsinguga).

    egrep on sama mis grep -E

    fgrep on sama mis grep -F

    rgrep on sama mis grep -r

    grep [-b] [-c] [-i] [-l] [-n] [-s] [-v] limited_regex_BRE [fail...]

Käsk grep sobitab lähtefailides olevad read piiratud_regexi määratud mustriga. Kui faile pole määratud, kasutatakse standardsisendit. Tavaliselt kopeeritakse iga edukalt sobitatud string standardväljundisse; kui lähtefaile on mitu, antakse faili nimi enne leitud rida. grep kasutab kompaktset mittedeterministlikku algoritmi. Piiratud regulaaravaldisi (avaldisi, millel on tähemärkide jadad koos nende tähendustega ja mis kasutavad piiratud komplekti tähtnumbrilisi ja erimärke) tajutakse mallidena. Neil on sama tähendus kui regulaaravaldistel väljaandes ed.

Märkide $, *, , ^, |, () ja \ vältimiseks shellistõlgendusest on kõige lihtsam lisada constrained_regex ühekordsetesse jutumärkidesse.

Valikud:

B Eessõna igale reale plokinumbriga, millest see leiti. See võib olla kasulik konteksti alusel plokkide otsimisel (plokid nummerdatakse alates 0-st). -c Prindib ainult mustrit sisaldavate ridade arvu. -h Takistab sobitatud rida sisaldava failinime trükkimise enne rida ennast. Kasutatakse mitme faili otsimisel. -i Eirab võrdluste tegemisel suur- ja suurtähti. -l Prindib ainult vastavaid stringe sisaldavate failide nimed, ühe rea kohta. Kui muster leitakse faili mitmelt realt, siis failinime ei korrata. -n Prindib enne iga rida selle numbri failis (read nummerdatakse alates 1). -s Suletab sõnumid olematute või loetamatute failide kohta. -v Prindib kõik read, välja arvatud need, mis sisaldavad mustrit. -w Otsib väljendit sõnana, nagu oleks see ümbritsetud metamärkidega \< и \>.

grep -- aidake

Kasutus: grep [VALIK]... MUSTER [FAIL]... Otsib igas FAILIS või standardsisendis mustrit PATTERN. Vaikimisi on PATTERN lihtne regulaaravaldis (BRE). Näide: grep -i "tere maailm" menu.h main.c Regulaaravaldise tüübi valimine ja selle tõlgendus: -E, --extended-regexp PATTERN - laiendatud regulaaravaldis (ERE) -F, --fixed-regexp PATTERN - fikseeritud pikkusega stringid, eraldatud reavahetusmärgiga -G, --basic-regexp PATTERN - lihtne regulaaravaldis (BRE) -P, --perl-regexp PATTERN - Perli regulaaravaldised -e, --regexp=MUSTER kasutage MUSTER otsing - f, --file=FILE võta muster failist FILE -i, --ignore-case ignore suur- ja suurtähtede erinevust -w, --word-regexp MUSTER peab ühtima kõigi sõnadega -x, --line-regexp MUSTER peab vastama tervele reale -z, --null-data read eraldatakse nullbaidiga, mitte rea lõpu märgiga. Muu: -s, --no-messages surub veateateid maha -v, --revert-match vali sobimatud read -V, - - versioon prindi versiooni teave ja välju --help selle spikri kuvamine ja väljumine --mmap tagasiühilduvuse jaoks, ignoreeritud Väljundi juhtimine: -m, --max-count=NUM stop pärast määratud NUM vastab -b, --bait- nihketrükk baitide nihe koos väljundridadega -n, --rea-number prindib rea numbri koos väljundridadega --line-buffered loputage puhver iga rea ​​järel -H, --with-failinimi prindib igale reale failinime vaste -h , --no-failinimi ei alusta väljundit failinimega --label=LABEL kasuta standardsisendi failinimena LABEL -o, --only-matching näitab ainult seda osa reast, mis ühtib mustriga -q, --quiet, - -silent supress kõik normaalsed väljundid --binary-files=TYPE eeldab, et binaarfaili TÜÜP on binaarne, tekst või ilma vasteta. -a, --text sama mis --binary-files=text -Ma sama mis --binary-files=ilma vaste -d, --kataloogid=ACTION kuidas katalooge käsitleda ACTION saab lugeda ), kordus (rekursiivselt) või jäta vahele (vahele). -D, --devices=ACTION kuidas käsitseda seadmeid, FIFO-sid ja pesasid ACTION saab lugeda või vahele jätta -R, -r, --rekursiivne sama mis --directories=recurse --include=F_PATTERN töötleb ainult failid, mis vastavad alla F_TEMPLATE - -exclude=F_TEMPLATE jätke vahele failid ja kataloogid, mis vastavad F_TEMPLATE'ile --exclude-from=FILE jäta vahele failid, mis vastavad mallifailidele failist FILE --exclude-dir=MUSTER vastavad kataloogid TEMPLATE jäetakse vahele -L, - -files-without-match ainult print FAILIDE nimed ilma vasteteta -l, --files-with-matches prinditakse ainult vastetega FAILInimed -c, --count prindib ainult sobivate ridade arvu FAILI kohta -T, --algne-tab joonduskaart (vajadusel) - Z, --null prindi bait 0 pärast FAILI nime Kontekstihaldus: -B, --befor-context=NUM prindib eelneva konteksti ridade ARV -A, --af-context=NUM prindib ridade ARVU järgnev kontekst -C, --context[=NUMBER] prindib kontekstiridade ARVU -NUMBER on sama, mis --context=NUMBER --color[=WHEN], --colour[=WHEN] kasutage sobitamise eristamiseks markereid jooned; WHEN võib olla alati, mitte kunagi või auto -U, --binaarne ei eemalda CR-märke rea lõpust (MSDOS) -u, --unixi-baidi-nihked näitavad nihet nii, nagu CR-sid polekski (MSDOS) ) Sõna "egrep" asemel peaks käivitama "grep -E". "fgrep" asemel eeldatakse "grep -F". Parem on mitte käivitada kui “egrep” või “fgrep”. Kui FILE pole määratud või FILE on -, loetakse standardsisend. Kui määratud on vähem kui kaks faili, eeldatakse -h. Kui leitakse sobivus, on väljumiskood 0 ja 1, kui mitte. Kui ilmnevad vead või kui suvandit -q pole määratud, on väljumiskood 2. Teatage vigadest: Palun teatage tõlkevigadest aadressile: GNU Grepi koduleht: Abi GNU programmidega töötamiseks:

Üks kõige kasulikumaid ja funktsioonirikkamaid käske Linuxi terminalis on käsk “grep”. Nimi on akronüüm ingliskeelsest fraasist "otsige globaalselt regulaaravaldisele vastavaid ridu ja printige need välja" (otsige igalt poolt regulaaravaldisele vastavaid ridu ja printige need). Käsk "grep" kontrollib sisendvoogu ridade kaupa, otsides vasteid ja väljastab (filtreerib) ainult neid ridu, mis sisaldavad antud mustrile vastavat teksti - regulaaravaldis.

Regulaaravaldised on spetsiaalne formaalne keel tekstis alamstringide otsimiseks ja manipuleerimiseks, mis põhineb metamärkide kasutamisel. Nüüd on peaaegu kõigil kaasaegsetel programmeerimiskeeltel sisseehitatud tugi tekstitöötluse regulaaravaldistele, kuid ajalooliselt on UNIX-i maailm ja eriti käskudesse “grep”, “sed” jne manustatud ideed andnud suure panuse. selle lähenemise populariseerimisele Filosoofia “kõik on fail” läbib UNIX-i täielikult ja tekstifailidega töötamise tööriistade valdamine on iga Linuxi kasutaja üks nõutavaid oskusi.

NÄIDIS

GIST | Lihtne otsing kõigi ridade jaoks, mis sisaldavad teksti "Adams". Selle ja järgnevate näidete vormindamisel järgime järgmist järjestust: käsurea parameetrid ülaosas, standardsed vood all, stdin sisend vasakul ja stdout väljund paremal.

Käsul "grep" on muljetavaldav hulk valikuid, mida saate selle käivitamisel määrata. Nende valikute abil saate teha palju kasulikke asju ja te ei pea isegi regulaaravaldise süntaksis hästi kursis olema.

VALIKUD

Alustame sellest, et “grep” ei saa mitte ainult filtreerida standardset sisendit stdin, vaid ka otsida faile. Vaikimisi otsib grep ainult praeguses kataloogis olevaid faile, kuid saate kasutada väga kasulikku suvandit --recursive, et käskida grepil otsida rekursiivselt alates antud kataloogist.

GIST | Vaikimisi on grep-käsk tõstutundlik. Järgmises näites on näidatud, kuidas saate otsida ilma, et suurtähti oleks tundlik, näiteks "Adams" ja "adams" on samad.

Ignoreeri - "adams"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 John Adams, 1797-1801

GIST | Otsing on vastupidine (mõnikord öeldakse ümberpööratud otsing), see tähendab, et kuvatakse kõik read, välja arvatud need, millel on määratud muster:

Pöörake vaste "Adams"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 George Washington, 1789-1797 Thomas Jefferson, 1801-1809

GIST | Võimalusi saab ja tuleks muidugi omavahel kombineerida. Näiteks otsing vastupidises järjekorras, kuvades esinemistega ridade seerianumbrid:

Rea number -- invert-match "Adams"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 1: George Washington, 1789-1797 3: Thomas Jefferson, 1801-1809

GIST | Värvimine. Mõnikord on mugav, kui otsitav sõna on värviliselt esile tõstetud. Kõik see on juba "grepis", jääb üle vaid lisada:

Rea number --color=alati "Adams"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 2: John Adams, 1797-1801

GIST | Soovime logifailist valida kõik vead, kuid teame, et järgmine rida pärast viga võib sisaldada kasulikku teavet, siis on mugav kontekstist mitut rida kuvada. Vaikimisi prindib grep ainult selle rea, kust vaste leiti, kuid grep printimiseks on mitu võimalust. Mitme rea (meie puhul kaks) väljastamiseks pärast kirjet:

Värv = alati -A2 "Adams"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 James Madison, 1809-1817 James Monroe, 1817-1825 John Adams, 1797-1801 Thomas Jefferson, 1801-1801 Thomas Jefferson, 1801-8, 1801-0918.

GIST | Samamoodi mitme rea lisaväljundi jaoks enne kirjet:

Värv = alati -B2 "James"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 James Madison, 1809-1817 James Monroe, 1817-1825 John Adams, 1797-1801 Thomas Jefferson, 1797-1801. , 1817-1825

GIST | Kuid enamasti peate kuvama sümmeetrilise konteksti, selleks on veelgi lühem tähis. Trükime kaks rida nii kirje kohale kui alla:

Värv = alati -C2 "James"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 James Madison, 1809-1817 James Monroe, 1817-1825 John Quincy Adams, 1825-1829 Andrew, 1825-1829 Andrew 1818, 1818829-1818. John Adams, 1797-1801 Thomas Jefferson, 1801-1809 James Madison, 1809-1817 James Monroe, 1817-1825 John Quincy Adams, 1825-1829 Andrew Jackson, 1829-1837

GIST | Kui otsite qwe, väljastab "grep" vaikimisi ka qwe123, 345qwerty ja sarnased kombinatsioonid. Leiame ainult need read, mis lülitavad kogu sõna välja:

Word-regexp --color=alati "John"

John Fitzgerald Kennedy, 1961-1963 Lyndon Baines Johnson, 1963-1969 John Fitzgerald Kennedy, 1961-1963

GIST | Ja lõpuks, kui soovite lihtsalt teada ridade arvu, mis vastavad ühele numbrile, kuid mitte midagi muud kuvada:

Count --color=alati "John"

John Fitzgerald Kennedy, 1961-1963 Lyndon Baines Johnson, 1963-1969 Richard Milhous Nixon, 1969-1974 2

Tasub tähele panna, et enamikul suvanditel on vaste, näiteks --ignore-case saab taandada lühemale kujule -i jne.

PÕHIVÄLJENDUSED

Kõik regulaaravaldised koosnevad kahte tüüpi tähemärkidest: standardsed tekstimärgid kutsutakse sõnasõnalised ja erimärke nimetatakse metategelased. Eelmistes näidetes viidi otsing läbi literaalide (tähtede täpne vaste) abil, kuid järgnev on palju huvitavam. Tere tulemast regulaaravaldiste maailma!

Caret ^ ja dollari märkidel $ on regulaaravaldises eriline tähendus. Neid nimetatakse "ankruteks". Ankrud on erimärgid, mis näitavad asukohta soovitud vaste stringis. Kui otsing jõuab ankruni, kontrollib see vastet, ja kui jah, jätkab see mustri järgimist. tulemusele midagi lisamata.

GIST | Caret ankrut kasutatakse selleks, et näidata, et regulaaravaldist tuleb testida rea ​​algusest:

Värv = alati "^J"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 John Adams, 1797-1801

GIST | Samamoodi tuleks mustri lõpus kasutada dollariankrut, mis näitab, et vaste kehtib ainult siis, kui otsitav märgistring asub tekstistringi lõpus, mitte muul viisil:

Värv = alati "9 $"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 Thomas Jefferson, 1801-1809

GIST | Ükskõik milline tegelane. Punktmärki kasutatakse regulaaravaldistes, et näidata, et määratud kohas võib esineda absoluutselt iga märk:

Värv = alati "0.$"

GIST | Varjestus. Kui teil on vaja täpselt leida punkti sümbol, siis aitab põgenemine. Märgile (nt punktile) eelnev paomärk (tavaliselt kaldkriips) muudab metamärgi literaaliks:

Värv = alati "\."

George Washington. 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 George Washington. 1789-1797

GIST | Tegelaste klassid. Regulaaravaldised võivad kasutada vahemikke ja märgiklasse. Selleks kasutatakse malli loomisel nurksulge. Asetades märkide rühma (sealhulgas märgid, mida muidu tõlgendataks metamärkidena) nurksulgudesse, saate näidata, et mis tahes sulgudes olevad märgid võivad sellel kohal esineda:

Värv = alati "0"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 John Adams, 1797-1801 Thomas Jefferson, 1801-1809

GIST | Vahemik. Need on kaks sidekriipsuga eraldatud märki, näiteks 0-9 (kümnendkohad) või 0-9a-fA-F (kuueteistkümnendkohad):

Värv = alati ""

George Washington, ??? John Adams, 1797-1801 Thomas Jefferson, 1801-1809 John Adams, 1797-1801 Thomas Jefferson, 1801-1809

GIST | Eitus. Kui nurksulgudes oleva avaldise esimene märk on tähis, võetakse ülejäänud märgid märkide komplektina, mida regulaaravaldise antud kohas ei tohiks olla:

Värv = alati "[^7]$"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 John Adams, 1797-1801 Thomas Jefferson, 1801-1809

GIST | POSIX märgiklassid. On olemas teatud komplekt eelnevalt ettevalmistatud märgiklasse, mida saate regulaaravaldistes kasutada. Neid on kümmekond, vaadake lihtsalt kiiresti juhend läbi, et mõista igaühe eesmärki. Näiteks filtreerime ainult kuueteistkümnendarvud:

Värv = alati "^[[:xdigit:]]*$"

4,2 42 42abc 42 42abc

GIST | Korda (0 või enam korda). Üks kõige sagedamini kasutatavaid metamärke on tärn, mis tähendab "eelmise tähemärgi või avaldise kordamine null või rohkem korda":

Värv = alati "^*$"

George Washington, ??? John Adams, 1797-1801 Thomas Jefferson, 1801-1809 George Washington, ???

On olemas põhilised regulaaravaldised BRE (põhilised regulaaravaldised) ja laiendatud regulaaravaldised ERE (laiendatud regulaaravaldised). BRE-s tuntakse ära järgmised metamärgid: ^$. * ja kõiki teisi märke käsitletakse literaalidena. Kas ERE-sse () ( ) on lisatud järgmised metamärgid? + | ja sellega seotud funktsioonid. Et kõik täiesti segadusse ajada, mõtlesid nad selle asja välja “grepis” – BRE-s olevaid tegelasi () ( ) käsitletakse metamärkidena, kui nende eest põgenetakse kaldkriipsuga, ERE-s aga kaldkriipsu ette. kõik metamärgid viivad selleni, et neid käsitletakse kui literaale.

TÄIENDATUD REGULAARVÄLJENDUSED

GIST | Disjunktsioon. Nii nagu nurksulud määravad ühele märgile erinevad võimalikud vasted, võimaldab disjunktsioon määrata alternatiivseid vasteid märgistringidele või avaldistele. Vertikaalset riba sümbolit kasutatakse disjunktsiooni tähistamiseks:

Extended-regexp --color=alati "George|John"

George Washington, 1789-1797 John Adams, 1797-1801 Thomas Jefferson, 1801-1809 George Washington, 1789-1797 John Adams, 1797-1801

GIST | Sobitage null või üks kord. Laiendatud regulaaravaldistes on mitu täiendavat metamärki, mis näitavad, kui sageli märgi või avaldist korratakse (sarnaselt sellele, kuidas tärn metamärk tähistab 0 või enama korra vasteid). Üks selline metamärk on küsimärk, mis muudab eelmise märgi või väljendi sisuliselt valikuliseks:

Extended-regexp --color=alati "^(Andrew)?John"

John Adams, 1797-1801 Andrew Johnson, 1865-1869 Lyndon Baines Johnson, 1963-1969 John Adams, 1797-1801 Andrew Johnson, 1865-1869

GIST | Sobitage üks või mitu korda. Selleks on ette nähtud plussmärgi kujul olev metamärk. See toimib peaaegu nagu tärni sümbol, välja arvatud see, et väljend peab kattuma vähemalt korra:

Extended-regexp --color=alati "^[[:alpha:] ]+$"

John Adams Andrew Johnson, 1865-1869 Lyndon Baines Johnson, 1963-1969 John Adams

GIST | Sobitage määratud arv kordi. Selleks võite kasutada lokkis trakse. Neid metamärke kasutatakse avaldise täpse arvu, vahemiku ning vastete arvu ülemise ja alumise piiri näitamiseks:

Extended-regexp --color=alati "(1,3)\.(1,3)\.(1,3)\.(1,3)"

42 127.0.0.1 127.0.0.1

Käsk grep on nii kasulik, funktsioonirikas ja hõlpsasti kasutatav, et kui olete selle teadnud, ei kujuta te ettegi ilma selleta töötamist.

Regulaaravaldised on väga võimas tööriist teksti mustri järgi otsimiseks, stringide töötlemiseks ja muutmiseks, mida saab kasutada paljude probleemide lahendamiseks. Siin on peamised:

  • tekstisisestuse kontroll;
  • Otsige ja asendage teksti failis;
  • Failide partii ümbernimetamine;
  • Suhtlemine selliste teenustega nagu Apache;
  • Stringi kontrollimine mustriga sobivaks.

See pole täielik loetelu, regulaaravaldised võimaldavad teil teha palju rohkem. Kuid uute kasutajate jaoks võivad need tunduda liiga keerulised, kuna nad kasutavad nende loomiseks spetsiaalset keelt. Kuid pakutavaid võimalusi arvestades peaks iga süsteemiadministraator teadma ja oskama kasutada Linuxi regulaaravaldisi.

Selles artiklis vaatleme algajatele mõeldud bashi regulaaravaldisi, et saaksite mõista selle tööriista kõiki funktsioone.

Regulaaravaldistes saab kasutada kahte tüüpi märke:

  • tavalised tähed;
  • metategelased.

Tavalised märgid on tähed, numbrid ja kirjavahemärgid, mis moodustavad mis tahes stringi. Kõik tekstid koosnevad tähtedest ja neid saab kasutada regulaaravaldistes, et leida tekstis soovitud asukoht.

Metamärgid on midagi muud, need annavad regulaaravaldistele oma jõu. Metamärkide abil saate teha palju enamat kui lihtsalt otsida ühte märki. Saate otsida sümbolite kombinatsioone, kasutada dünaamilist arvu sümboleid ja valida vahemikke. Kõik erimärgid võib jagada kahte tüüpi: asendusmärgid, mis asendavad tavalisi märke, või operaatorid, mis näitavad, mitu korda saab märki korrata. Regulaaravaldise süntaks näeks välja selline:

tavaline_märk erimärk_operaator

spetsiaalne_asendustegelane erimärk_operaator

  • \ - tähestikulised erimärgid algavad kaldkriipsuga ja seda kasutatakse ka siis, kui peate kasutama erimärki mis tahes kirjavahemärgi kujul;
  • ^ - näitab rea algust;
  • $ - näitab rea lõppu;
  • * - näitab, et eelmist märki võib korrata 0 või enam korda;
  • + - näitab, et eelmist märki tuleks korrata üks või mitu korda;
  • ? - eelmine märk võib esineda null või üks kord;
  • (n)- näitab, mitu korda (n) tuleb eelmist märki korrata;
  • (N,n)- eelmist märki saab korrata N kuni n korda;
  • . - mis tahes märk, välja arvatud reavahetus;
  • - mis tahes sulgudes märgitud märk;
  • x|y- sümbol x või sümbol y;
  • [^az]- mis tahes tähemärki, välja arvatud sulgudes märgitud;
  • - mis tahes märk määratud vahemikust;
  • [^a-z]- iga märk, mis ei ole vahemikus;
  • \b- tähistab sõnapiiri tühikuga;
  • \B- tähendab, et märk peab olema sõna sees, näiteks ux vastab uxb-le või tuxedo-le, kuid ei vasta Linuxile;
  • \d- tähendab, et sümbol on arv;
  • \D- mittedigitaalne sümbol;
  • \n- reavahetuse märk;
  • \s- üks tühikumärkidest, tühik, tabeldusmärk ja nii edasi;
  • \S- mis tahes märk, välja arvatud tühik;
  • \t- tabeldusmärk;
  • \v- vertikaalne tabeldusmärk;
  • \w- mis tahes tähestikuline täht, sealhulgas alakriips;
  • \W- mis tahes tähemärki, välja arvatud allkriips;
  • \uXXX- Unicdoe sümbol.

Oluline on märkida, et tähestikuliste erimärkide ees tuleb kasutada kaldkriipsu, et näidata, et järgmine erimärk tuleb. See on ka vastupidine, kui soovite tavalise märgina kasutada erimärki, mida kasutatakse ilma kaldkriipsuta, siis peate lisama kaldkriipsu.

Näiteks soovite tekstist leida rida 1+ 2=3. Kui kasutate seda stringi regulaaravaldisena, ei leia te midagi, sest süsteem tõlgendab plussi erimärgina, mis näitab, et eelmist ühikut tuleks korrata üks või mitu korda. Seega tuleb see paotada: 1 \+ 2 = 3. Ilma põgenemiseta vastaks meie regulaaravaldis ainult stringile 11=3 või 111=3 ja nii edasi. Pole vaja rida võrdse ette panna, sest see pole erimärk.

Näited regulaaravaldiste kasutamisest

Nüüd, kui oleme põhitõed läbi vaadanud ja teate, kuidas kõik töötab, jääb üle vaid Linuxi grepi regulaaravaldiste kohta omandatud teadmisi praktikas kinnistada. Kaks väga kasulikku erimärki on ^ ja $, mis näitavad rea algust ja lõppu. Näiteks tahame, et meie süsteemi registreeritaks kõik kasutajad, kelle nimi algab tähega s. Seejärel saate kasutada regulaaravaldist "^s". Võite kasutada käsku egrep:

egrep "^s" /etc/passwd

Kui tahame ridu valida rea ​​viimase märgi järgi, saame selleks kasutada $. Näiteks valime kõik süsteemi kasutajad, ilma kestata, selliste kasutajate kirjed lõppevad valega:

egrep "false$" /etc/passwd

S või d-ga algavate kasutajanimede kuvamiseks kasutage seda väljendit:

egrep "^" /etc/passwd

Sama tulemuse saab sümboli "|" abil. Esimene valik sobib rohkem vahemike jaoks ja teist kasutatakse sagedamini tavaliste või/või:

egrep "^" /etc/passwd

Nüüd valime kõik kasutajad, kelle nimi ei ole kolm tähemärki pikk. Kasutajanimi lõpeb kooloniga. Võime öelda, et see võib enne koolonit sisaldada mis tahes tähestikku, mida tuleb kolm korda korrata:

egrep "^\w(3):" /etc/passwd

järeldused

Selles artiklis käsitlesime Linuxi regulaaravaldisi, kuid see oli vaid põhitõde. Kui veidi süveneda, avastate, et saate selle tööriistaga teha palju huvitavamaid asju. Regulaaravaldiste valdamiseks kuluv aeg tasub end kindlasti ära.

Lõpetuseks Yandexi loeng regulaaravaldiste kohta:

Originaal: Linux Fundamentals
Autor: Paul Cobbaut
Avaldamise kuupäev: 16. oktoober 2014
Tõlge: A. Panin
Tõlke kuupäev: 17. detsember 2014

Peatükk 19. Regulaaravaldised

Regulaaravaldise mootor on Linuxi süsteemis väga võimas tööriist. Regulaaravaldisi saab kasutada paljude programmidega, nagu bash, vi, ümbernimetamine, grep, sed ja teised.

See peatükk annab põhiteadmised regulaaravaldistest.

Regulaaravaldise süntaksi versioonid

Regulaaravaldise süntaksil on kolm erinevat versiooni: BRE: põhilised regulaaravaldised ERE: laiendatud regulaaravaldised PCRE: Perli regulaaravaldised

Olenevalt kasutatavast tööriistast võib kasutada ühte või mitut nimetatud süntaksit.

Näiteks grep tööriist toetab suvandit -E, et sundida regulaaravaldise sõelumisel kasutama laiendatud regulaaravaldise süntaksit (ERE), samas kui suvand -G sunnib kasutama põhiregulaaravaldise süntaksit (BRE) ja suvandit -P - Perli programmeerimiskeele regulaaravaldise (PCRE) süntaks.

Pange tähele ka seda, et grep toetab ka suvandit -F, mis võimaldab regulaaravaldist lugeda ilma töötlemiseta.

Tööriist sed toetab ka suvandeid, mis võimaldavad teil valida regulaaravaldise süntaksi.

Lugege alati kasutatavate tööriistade kasutusjuhendit!

grep utiliit

Mustrile vastavate stringide trükkimine

Utiliit grep on Linuxi süsteemides populaarne tööriist, mis on loodud kindlale mustrile vastavate stringide leidmiseks. Allpool on toodud näited lihtsaimatest regulaaravaldistest, mida saab sellega töötamisel kasutada.

See on näidetes kasutatud testfaili sisu. See fail sisaldab kolme rida (või kolme reavahetust). paul@rhel65:~$ kassinimed Tania Laura Valentina

Ühe märgi otsimisel tagastatakse ainult need read, mis sisaldavad määratud märki. paul@rhel65:~$ grep u nimed Laura paul@rhel65:~$ grep e nimed Valentina paul@rhel65:~$ grep i nimed Tania Valentina

Võrdlus selles näites kasutatud mustriga on lihtne; kui antud märk esineb stringis, prindib grep selle stringi.

Tegelaste kombineerimine

Tähemärkide kombinatsioonide leidmiseks stringides tuleb regulaaravaldise märgid kombineerida sarnasel viisil.

See näide demonstreerib, kuidas töötab grep-utiliit, mille kohaselt regulaaravaldis ia vastab stringile Tan ia, kuid mitte stringile Valentina ning regulaaravaldis in vastab stringile Valent in a, kuid mitte stringile Ta ni a. paul@rhel65:~$ grep a nimed Tania Laura Valentina paul@rhel65:~$ grep ia nimed Tania paul@rhel65:~$ grep nimedes Valentina paul@rhel65:~$

Üks või teine ​​tegelane

Nii PCRE kui ka ERE süntaks võivad kasutada programmikanali loomise sümbolit, mis antud juhul kujutaks endast loogilist VÕI-toimingut. Selles näites kasutame utiliiti grep, et otsida ridu, mis sisaldavad märki i või märki a. paul@debian7:~$ kasside nimekiri Tania Laura paul@debian7:~$ grep -E "i|a" nimekiri Tania Laura

Pange tähele, et me kasutame grep-i suvandit -E, et sundida meie regulaaravaldist tõlgendama laiendatud regulaaravaldise (ERE) süntaksit kasutava avaldisena.

Peame regulaaravaldises kanali loomise märgist põgenema, kasutades põhiregulaaravaldise (BRE) süntaksit, et tõlgendada seda märki sarnaselt loogilise VÕI-toiminguna. paul@debian7:~$ grep -G "i|a" nimekiri paul@debian7:~$ grep -G "i\|a" nimekiri Tania Laura

Üks või mitu vastet

Märk * vastab nullile, ühele või mitmele eelmise märgi esinemisele ja märk + vastab järgmisele märgile. paul@debian7:~$ cat list2 ll lol lool loool paul@debian7:~$ grep -E "o*" list2 ll lol lool loool paul@debian7:~$ grep -E "o+" list2 lol lool loool paul@debian7: ~$

Matš rea lõpus

Järgmistes näidetes kasutame seda faili: paul@debian7:~$ kassinimed Tania Laura Valentina Fleur Floor

Kaks alltoodud näidet näitavad meetodit dollarimärgi kasutamiseks stringi lõpu sobitamiseks. paul@debian7:~$ grep a$ nimed Tania Laura Valentina paul@debian7:~$ grep r$ nimed Fleur Floor

Matš rea alguses

Tähemärk (^) võimaldab otsida vastet stringi algusest (või esimestest tähemärkidest).

Need näited kasutavad ülalpool käsitletud faili. paul@debian7:~$ grep ^Val nimed Valentina paul@debian7:~$ grep ^F nimed Fleur Floor

Regulaaravaldistes kasutatavaid dollari ja caret märke nimetatakse ankruteks.

Sõnade poolitamine

Otsitavate sõnade põgenemine tühikute abil ei ole hea lahendus (kuna sõnade eraldajana võib kasutada ka teisi märke). Allolev näide näitab tehnikat märgijada \b kasutamiseks, et leida ridu, mis sisaldavad antud sõna, mitte märgijada: paul@debian7:~$ grep "\bover\b" tekst Talv on läbi. Kas sa saad sinna? paul@debian7:~$

Pange tähele, et grep toetab sõnaotsingute tegemiseks ka suvandit -w. paul@debian7:~$ cat text Kuberner valitseb. Talv on läbi. Kas sa saad sinna? paul@debian7:~$ grep -w üle teksti Talv on läbi. Kas sa saad sinna? paul@debian7:~$

grep Valikud

Mõnikord on lihtsam kombineerida lihtsat regulaaravaldist grepi suvanditega kui luua keerulisem regulaaravaldis. Neid valikuid arutati varem: grep -i grep -v grep -w grep -A5 grep -B5 grep -C5

Kesta regulaaravaldise laiendamise takistamine

Dollarimärk on nii regulaaravaldise kui ka kesta erimärk (mõelge kestamuutujatele ja kesta sisestele). Seetõttu on soovitatav igal juhul regulaaravaldistest põgeneda, sest regulaaravaldise vältimine aitab vältida kesta avaldise laiendamist. paul@debian7:~$ grep "r$" nimetab Fleuri korruse ümbernimetamise

utiliidi ümbernimetamine

Ümbernimetamise utiliidi rakendused

Debain Linuxi distributsioonis on /usr/bin/rename tee ääres link skriptile /usr/bin/prename, mis on installitud perli paketist. paul@pi ~ $ dpkg -S $(readlink -f $(mis nimetab ümber)) perl: /usr/bin/prename

Red Hati distributsioonil põhinevad distributsioonid ei loo sarnast sümboolset linki, mis osutaks kirjeldatud skriptile (muidugi juhul, kui ei loo sümboolset linki käsitsi installitud skriptile), mistõttu see jaotis ei kirjelda ümbernimetamise utiliidi rakendamist Red Hati levitamine.

Aruteludes ümbernimetamise utiliidi üle Internetis on tavaliselt segadus, kuna lahendusi, mis töötavad hästi Debiani distributsioonis (ja Ubuntu, xubuntu, Mint jne), ei saa kasutada Red Hati distributsioonis (ja CentOS-is, Fedora, ...).

perli pakett

Ümbernimetamise käsk on tegelikult realiseeritud skripti kujul, kasutades perli programmeerimiskeele regulaaravaldisi. Täielikud juhised selle skripti kasutamiseks leiate käsu perldoc perlrequick käivitamisest (pärast paketi perldoc installimist). root@pi:~# aptitude install perl-doc Paigaldatakse järgmised UUED paketid: perl-doc 0 paketti uuendatud, 1 uus installitud, 0 eemaldamiseks märgitud paketti ja 0 paketti uuendamata. Vajalik on hankida 8170 kB arhiive. Pärast lahtipakkimist on 13,2 MB hõivatud. Hangi: 1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main perl-do... Saabus 8170 kB 19 sekundiga (412 kB/s) Varem valimata paketi perl-doc valimine. (Andmebaasi lugemine... hetkel on installitud 67121 faili ja kataloogi.) Pakub lahti perl-doc (alates.../perl-doc_5.14.2-21+rpi2_all.deb) ... Lisatakse " /usr/bin /perldoc ümbersuunamine faili /usr/bin/perldoc.stub, perl-doc

Tuntud süntaks

Ümbernimetamise utiliidi kõige levinum kasutusala on leida faile, mille nimed vastavad kindlale stringikujulisele mustrile, ja asendada see string teise stringiga.

Tavaliselt kirjeldatakse seda toimingut regulaaravaldise s/string/teine ​​string/ abil, nagu on näidatud näites: paul@pi ~ $ ls abc allfiles.TXT bllfiles.TXT Scratch tennis2.TXT abc.conf backup cllfiles.TXT temp.TXT tennis TXT paul@pi ~ $ nimeta ümber "s/TXT/text/" * paul@pi ~ $ ls abc allfiles.text bllfiles.text Scratch tennis2.text abc.conf backup cllfiles.text temp.text tennis.text.

Siin on veel üks näide, mis kasutab tuntud ümbernimetamise utiliidi süntaksit samade failide laiendite uuesti muutmiseks: paul@pi ~ $ ls abc allfiles.text bllfiles.text Scratch tennis2.text abc.conf backup cllfiles.text temp.text tennis .text paul@pi ~ $ nimeta ümber "s/text/txt/" *.text paul@pi ~ $ ls abc allfiles.txt bllfiles.txt Scratch tennis2.txt abc.conf backup cllfiles.txt temp.txt tennis.txt paul @pi~$

Põhjus, miks need kaks näidet töötavad, on see, et meie kasutatavad stringid esinevad ainult faililaiendites. Pidage meeles, et faililaiendid ei oma bash-shelli kasutamisel tähtsust.

Järgmine näide näitab probleemi, mis võib selle süntaksi kasutamisel tekkida. paul@pi ~ $ puudutage atxt.txt paul@pi ~ $ nimeta "s/txt/problem/" ümber atxt.txt paul@pi ~ $ ls abc allfiles.txt backup cllfiles.txt temp.txt tennis.txt abc.conf probleem .txt bllfiles.txt Scratch tennis2.txt paul@pi ~ $

Kõnealuse käsu täitmisel asendatakse ainult otsitava stringi esimene esinemine.

Globaalne asendus

Eelmises näites kasutatud süntaksit saab kirjeldada järgmiselt: s/regex/string asendamiseks/ . See kirjeldus on lihtne ja ilmne, kuna peate vaid asetama regulaaravaldise kahe esimese kaldkriipsu vahele ja asendusstringi kahe viimase kaldkriipsu vahele.

Järgmine näide laiendab seda süntaksit veidi, lisades modifikaatori. paul@pi ~ $ nimeta ümber -n "s/TXT/txt/g" aTXT.TXT aTXT.TXT nimetati ümber atxt.txt paul@pi ~ $

Nüüd saab meie kasutatavat süntaksit kirjeldada kui s/regex/string to asenda/g, kus modifikaator s tähistab lülitustoimingut ja g modifikaator näitab, et tuleks teha globaalne muudatus.

Pange tähele, et selles näites kasutati suvandit -n, et kuvada teavet teostatava toimingu kohta (selle asemel, et sooritada toimingut ise, mis tähendab faili otsest ümbernimetamist).

Tõstutundmatu asendus

Teine modifikaator, mis võib olla kasulik, on i modifikaator. Allolev näide näitab tõstutundlikku tehnikat stringi asendamiseks teise stringiga. paul@debian7:~/files$ ls fail1.tekst fail2.TEKSTI fail3.txt paul@debian7:~/files$ nimeta ümber "s/.text/.txt/i" * paul@debian7:~/files$ ls fail1. txt fail2.txt fail3.txt paul@debian7:~/files$

Laiendite muutmine

Linuxi käsurea liides ei mõista MS-DOS operatsioonisüsteemis kasutatavate faililaienditega sarnaseid faililaiendeid, kuid paljud kasutajad ja GUI-rakendused kasutavad neid.

Selles jaotises on näide ümbernimetamise utiliidi kasutamisest ainult faililaiendite muutmiseks. Näites kasutatakse dollarimärki, et näidata, et asendamise alguspunkt on failinime lõpp. paul@pi ~ $ ls *.txt kõikfailid.txt bllfailid.txt cllfailid.txt tõesti.txt.txt temp.txt tennis.txt paul@pi ~ $ nimeta "s/.txt$/.TXT/" ümber *.txt paul @pi ~ $ ls *.TXT kõik failid.TXT bllfailid.TXT cllfailid.TXT tõesti.txt.TXT temp.TXT tennis.TXT paul@pi ~ $

Pange tähele, et dollarimärk regulaaravaldises tähistab rea lõppu. Ilma dollarimärgita peaks see käsk failinime tõesti.txt.txt töötlemisel ebaõnnestuma.

sed utiliit

Andmevoo redaktor

Vooredaktor ehk lühidalt sed kasutab andmevoo muutmiseks regulaaravaldisi.

Selles näites kasutatakse stringi asendamiseks utiliiti sed. kaja esmaspäev | sed "s/esmaspäev/teisipäev/" teisipäev

Kaldkriipsud saab asendada mõne muu märgiga, mis võib olla mugavam ja mõnel juhul parandada käsu loetavust. kaja esmaspäev | sed "s:E:T:" Teisipäev kaja esmaspäev | sed "s_Monday_Tue_" teisipäev kaja esmaspäev | sed "s|esmaspäev|teisipäev|" teisipäeval

Interaktiivne toimetaja

Kuigi sed on mõeldud vootöötluseks, saab seda kasutada ka interaktiivseks failitöötluseks. paul@debian7:~/files$ echo esmaspäev > täna paul@debian7:~/files$ cat täna esmaspäev paul@debian7:~/files$ sed -i "s/Mon/Te/" täna paul@debian7:~/files $ kass täna teisipäeval

Ampersandi märki saab kasutada otsitud (ja leitud) stringile viitamiseks.

Selles näites kasutatakse ampersandi leitud ridade arvu kahekordistamiseks. kaja esmaspäev | sed "s/Monday/&&/" MondayMonday kaja esmaspäev | sed "s/hüüdnimi/&&/" esmaspäev

Sulgusid kasutatakse regulaaravaldise osade rühmitamiseks, millele saab hiljem viidata.

Vaatleme järgmist näidet: paul@debian7:~$ echo Sunday | sed "s_\(Sun\)_\1ny_" Sunnyday paul@debian7:~$ echo Sunday | sed "s_\(Sun\)_\1ny \1_" Päikesepaisteline pühapäev

Punkt mis tahes tähemärgi tähistamiseks

Regulaaravaldises võib lihtne punktimärk tähistada mis tahes märki. paul@debian7:~$ echo 2014-04-01 | sed "s/....-..-../YYYY-MM-DD/" YYYY-MM-DD paul@debian7:~$ echo abcd-ef-gh | sed "s/....-..-../YYYY-MM-DD/" YYYY-MM-DD

Kui kasutatakse rohkem kui ühte sulgude paari, saab igale neist viidata järjestikuste arvväärtuste abil. paul@debian7:~$ echo 2014-04-01 | sed "s/\(..\)-\(..\)-\(..\)/\1+\2+\3/" 2014+04+01 paul@debian7:~$ echo 2014 -04 -01 | sed "s/\(..\)-\(..\)-\(..\)/\3:\2:\1/" 01:04:2014

Seda funktsiooni nimetatakse rühmitamiseks.

Kosmos

Märgijada \s saab kasutada märgile, näiteks tühiku- või tabeldusmärgile viitamiseks.

See näide otsib globaalselt tühikumärkide jadasid (\s) ja asendab need 1 tühikuga. paul@debian7:~$ echo -e "täna\twarm\tday" täna on soe päev paul@debian7:~$ echo -e "täna\twarm\tday" | sed "s_\s_ _g" täna on soe päev

Valikulised esinemised

Küsimärk näitab, et eelmine märk on valikuline.

Allolev näide otsib kolmest o-märgist koosnevat jada, kusjuures kolmas o on valikuline. paul@debian7:~$ cat list2 ll lol lool loool paul@debian7:~$ grep -E "ooo?" list2 lool loool paul@debian7:~$ cat list2 | sed "s/ooo\?/A/" ll lol lAl lAl

Täpselt n kordust

Saate määrata eelmise tähemärgi korduste täpse arvu.

See näide otsib stringe, milles on täpselt kolm o-märki. paul@debian7:~$ cat list2 ll lol lool loool paul@debian7:~$ grep -E "o(3)" list2 loool paul@debian7:~$ cat list2 | sed "s/o\(3\)/A/" ll lol lool lAl paul@debian7:~$

Kordust n-st m-ni

Ja selles näites näitame selgelt, et sümbolit tuleb korrata minimaalselt (2) kuni maksimaalselt (3) kordadeni. paul@debian7:~$ cat list2 ll lol lool loool paul@debian7:~$ grep -E "o(2,3)" list2 lool loool paul@debian7:~$ grep "o\(2,3\)" list2 lool loool paul@debian7:~$ kasside nimekiri2 | sed "s/o\(2,3\)/A/" ll lol lAl lAl paul@debian7:~$

Bash kesta ajalugu

Bash-shell võib tõlgendada ka mõningaid regulaaravaldisi.

See näide näitab tehnikat hüüumärgiga manipuleerimiseks otsingumaski ajaloos bash-shelli ajaloos. paul@debian7:~$ mkdir hist paul@debian7:~$ cd hist/ paul@debian7:~/hist$ puutefail1 fail2 fail3 paul@debian7:~/hist$ ls -l fail1 -rw-r--r-- 1 paul paul 0 15. aprill 22:07 file1 paul@debian7:~/hist$ !l ls -l file1 -rw-r--r-- 1 paul paul 0 15. aprill 22:07 file1 paul@debian7:~/hist $ !l:s/1/3 ls -l fail3 -rw-r--r-- 1 paul paul 0 15. aprill 22:07 file3 paul@debian7:~/hist$

See tehnika töötab ka siis, kui kasutate bash-shelli käsuajaloo lugemisel numbreid. paul@debian7:~/hist$ ajalugu 6 2089 mkdir hist 2090 cd hist/ 2091 puutetundlik fail1 fail2 fail3 2092 ls -l fail1 2093 ls -l fail3 2094 ajalugu 6 paul@debian7:~/hist$ !2092 -ls fail rw-r--r-- 1 paul paul 0 15. aprill 22:07 file1 paul@debian7:~/hist$ !2092:s/1/2 ls -l fail2 -rw-r--r-- 1 paul paul 0 15. aprill 22:07 file2 paul@debian7:~/hist$