Terminaliga: Regulaaravaldiste II kasutamine: asendused

Iseendas eelmises artiklis Olen teile põhitasandil rääkinud, kuidas toimivad regulaarsete väljendite kõik enimkasutatud erimärgid. Nende regulaaravaldistega on võimalik teha keerukaid otsinguid tekstifailides või muude käskude väljundis. Selles artiklis selgitan, kuidas kasutada sed-käsku teksti leidmiseks ja asendamiseks palju võimsamal viisil kui ühe teksti vahetamine teise vastu.

Natuke veel grep-käsu kohta

Enne kui hakkan sed-ist rääkima, tahaksin natuke rohkem kommenteerida käsku grep, et eelmises artiklis selgitatut natuke lõpule viia. Kõik, mida ma ütlen, on ka selle jaoks asjakohane. Hiljem näeme selle ja otsingute suhet.

Regulaaravaldiste ühendamine

Paljusid eritegelasi, kellest olen eelmises artiklis rääkinud, saab kombineerida mitte ainult teiste tegelastega, vaid tervete regulaaravaldistega. Selle tegemiseks on alamväljenduse moodustamiseks sulgude kasutamine. Vaatame selle näite. Alustuseks laadime alla teksti, mida saame testimiseks kasutada. See on fraaside loend. Selleks kasutame järgmist käsku:

curl http://artigoo.com/lista-de-frases-comparativas-comicas 2>/dev/null | sed -n 's/.*\(.*\.\)<\/p>/\1/gp' > frases

 See jätab teid kataloogi, kus käivitate faili nimega «fraasid». Võite selle avada, et pilk visata ja natuke naerda. 🙂

Oletame nüüd, et tahame leida fraase, milles on täpselt 6 sõna. Raske on moodustada regulaarne avaldis, mis sobib igale sõnale. Sõna on kas suur- või väiketähtede jada, mis oleks umbes selline '[a-zA-Z]+', kuid peate ka täpsustama, et need tähed peavad olema eraldatud muude tähtedega kui tähed, see oleks midagi sellist '[a-zA-Z]+[^a-zA-Z]+'. Tuletame meelde: sulgudes esimese tähemärgina "^" näitab, et me tahame sobitada tähemärkidega, mis ei kuulu vahemikku, ja "+" tähistab ühte või enamat tähemärki.

Meil on juba olemas regulaarne väljend, mis sobib sõnaga. Selle sidumiseks 6-ga tuleb seda korrata 6 korda. Selleks kasutasime võtmeid, kuid see on kasutu '[a-zA-Z]+[^a-zA-Z]+{6}', sest 6 kordaksid regulaaravaldise viimast osa ja me tahame seda kõike korrata, nii et peame panema selle: '([a-zA-Z]+[^a-zA-Z]+){6}'. Sulgudega moodustame alaväljenduse ja traksidega kordame seda 6 korda. Nüüd peate lihtsalt lisama "^" ette ja "$" tagaküljele, et see sobiks kogu reaga. Käsk on järgmine:

grep -E '^([a-zA-Z]+[^a-zA-Z]+){6}$' frases

Ja tulemus on just see, mida me tahtsime:

Seda lauldakse rohkem kui Macarenat. Sa oled rohkem valmis kui Luis Aguilé. Teil on vähem kultuuri kui kivil. Teate rohkem keeli kui Cañita Brava. Kortse on tal rohkem kui Tutan Khamónil. Teate lastehoiust vähem kui Rambo.

Pange tähele, et me panime parameetri -E, kuna tahame "+" toimimiseks kasutada laiendatud regulaaravaldisi. Kui kasutaksime põhilisi, peaksime sulgudest ja traksidest pääsema.

Tagasi viited või tagasiviited

Kui teil on õigekirjakontroll installitud, on teil tõenäoliselt sõnade loend /usr/share/dict/words. Kui ei, saate selle arhi installida järgmisega:

sudo pacman -S words

Või debianis koos:

sudo aptitude install dictionaries-common

Kui soovite, võite faili vaadata, et näha, milliseid sõnu see sisaldab. Tegelikult on see link selle keele sõnafailile, milles teie levitaja on. Korraga võite installida mitu sõnafaili.

Me hakkame seda faili kasutama. Selgub, et meil on väga uudishimulik teada kõiki seitset tähepalindroomi seal. Neile, kes ei tea: palindroom on capicúa sõna, see tähendab, et seda saab lugeda nii vasakult paremale kui ka paremalt vasakule. Proovime järgmist käsku:

grep '^\(.\)\(.\)\(.\).\3\2\1$' /usr/share/dict/words

See tundub natuke imelik, eks? Kui proovime seda, sõltub tulemus teie levitamise keelest ja loendis olevatest sõnadest, kuid minu puhul on hispaania keelega tulemus järgmine:

aniliini aniliini valtsimine

Vaatame, kuidas see regulaarne väljend töötab.

Peale tähtede "^" ja "$", mille jaoks me juba teame, milleks see on, näeme vasakul esimese asjana kolme sulgudesse suletud punktide rühma. Ärge laske end segi ajada iga sulgude ees olevate ribadega. Nad peavad sulgudest põgenema, kuna kasutame põhilisi regulaaravaldisi, kuid neil pole muud tähendust. Oluline on see, et palume suvalist kolme tähemärki täppidega, kuid kõik need punktid on suludesse suletud. Selle eesmärk on salvestada nendele punktidele vastavad märgid, et neile saaks regulaaravaldisest uuesti viidata. See on veel üks sulgude kasutamine, mis tuleb hiljem asenduste tegemisel kasuks.

Siit tulevad kolm allpool olevat numbrit koos kaldkriipsuga ees. Sellisel juhul on riba oluline. Seda kasutatakse selleks, et näidata, et allpool olev number on taustreferents ja viitab ühele eelmistest sulgudest. Näiteks: \ 1 viitab esimesele sulgule, \ 2 teisele ja nii edasi.

See tähendab, et meie pandud regulaaravaldisega otsime kõiki sõnu, mis algavad mis tahes nelja tähega ja mille täht on sama, mis kolmas, teine ​​on sama, mis teine ​​ja teine see on sama mis esimene. Tulemuseks on seitsmetähelised palindroomid, mis on sõnaloendis. Täpselt nii nagu me tahtsime.

Kui kasutaksime laiendatud regulaaravaldisi, ei peaks me sulgudest põgenema, kuid laiendatud regulaaravaldiste korral ei tööta tagasiviited kõigis programmides, kuna need pole standardiseeritud. Kuid grepiga nad töötavad, nii et see võib olla veel üks viis sama teha. Võite seda proovida, kui soovite.

Asendusavaldised: sed-käsk

Lisaks otsimisele on regulaaravaldiste üks parimaid kasutusviise keerukate tekstide asendamine. Selleks on üks viis seda teha käsuga sed. Sed-käsu jõud läheb kaugele teksti asendamisest, kuid siin kavatsen ma seda selleks kasutada. Süntaks, mida kavatsen selle käsuga kasutada, on järgmine:

sed [-r] 's/REGEX/REPL/g' FICHERO

Või ka:

COMANDO | sed [-r] 's/REGEX/REPL/g'

Kus otsitakse regulaaravaldist REGEX ja asendage see asendus. Pidage meeles, et see käsk ei asenda tegelikult midagi näidatavas failis, kuid see näitab meile terminali asendamise tulemust, nii et ärge kartke neid käske, mida ma järgmisena panen. Ükski neist ei hakka teie süsteemis ühtegi faili muutma.

Alustame lihtsast näitest. Meil kõigil on kataloogis / etc erinevad konfiguratsioonifailid, millel on tavaliselt märkused algusega "#". Oletame, et soovime ühte neist failidest näha ilma kommentaarideta. Näiteks kavatsen seda teha fstabiga. Võite proovida soovitud.

sed 's/#.*//g' /etc/fstab

Ma ei hakka käsu tulemust siia panema, sest see sõltub sellest, mis teil fstabis on, kuid kui võrrelda käsu väljundit faili sisuga, näete, et kõik kommentaarid on kadunud.

Selles käsus on otsinguavaldus «#.*", See on" # ", millele järgneb suvaline arv tähemärke, see tähendab kommentaarid. Ja asendav avaldis, kui vaatate kahte riba järjest, näete, et neid pole, nii et see, mida ta teeb, asendab kommentaarid mitte millegagi, st kustutab need. Lihtsamalt võimatu.

Nüüd läheme vastupidi. Oletame, et soovime kommenteerida faili kõiki ridu. Proovime nii:

sed 's/^/# /g' /etc/fstab

Näete, et käsu väljundis algavad kõik read räsimärgi ja tühja kohaga. Meie oleme asendanud rea alguse sõnaga «# «. See on ka üsna lihtne näide, kus asendatav tekst on alati sama, kuid nüüd raskendame seda natuke rohkem.

Asenduste armu on see, et asendusavalduses saate kasutada selliseid taustreferente, nagu ma teile varem ütlesin. Naaseme tagasi fraasifaili juurde, mille me artikli alguses alla laadisime. Sulgudesse paneme kõik olemasolevad suurtähed, kuid teeme seda käsuga:

sed 's/\([A-Z]\)/(\1)/g' frases

See, mis meil siin on, on asendusavalduse taustreferents, mis viitab otsingusilme sulgudele. Asendusväljendi sulgud on tavalised sulgud. Asendusväljendil pole neil erilist tähendust, need pannakse nii, nagu need on. Tulemuseks on see, et kõik suurtähed asendatakse sama tähega, ükskõik mis see ka pole, selle ümber on sulgud.

On veel üks märk, mida saab kasutada ka asendusväljendis, see on "&" ja see asendatakse kogu otsinguavaldisega sobitatud tekstiga. Selle näiteks võib olla failis olevate fraaside panemine jutumärkidesse. Selle saab saavutada selle käsuga:

sed 's/.*/"&"/g' frases

Selle käsu toimimine on väga sarnane eelmisega, alles nüüd asendame kogu rea sama reaga, mille ümber on jutumärgid. Kuna kasutame tähte "&", pole sulge vaja panna.

Mõned kasulikud regulaarsete avaldistega käsud

Siin on mõned käsud, mis on minu arvates kasulikud või uudishimulikud ja kasutavad regulaaravaldisi. Nende käskudega on regulaaravaldiste kasulikkus palju parem kui nende näidete puhul, mille olen teile siiani andnud, kuid mulle tundus nende mõistmiseks oluline selgitada midagi regulaaravaldiste toimimise kohta.

  • Kuva manulehe jaotised:

man bash | grep '^[A-Z][A-Z ]*$'

Muidugi saate bashi käsu muuta mis iganes soovite. Ja siis saab inimeselt otse regulaaravaldist kasutades minna otse huvipakkuvasse jaotisesse. Otsingu alustamiseks vajutage «/» ja kirjutage «^ALIASES$»Selleks, et minna näiteks jaotisse ALIASES. Ma arvan, et see on esimene kasutus, mida hakkasin paar aastat tagasi regulaarselt väljendama. Juhendi mõnel leheküljel liikumine on ilma sellise trikita peaaegu võimatu.

  • Näidake kõigi masina kasutajate nimesid, sealhulgas spetsiaalseid:

sed 's/\([^:]*\).*/\1/' /etc/passwd

  • Kuva kasutajanimed, kuid ainult kestaga kasutajad:

grep -vE '(/false|/nologin)$' /etc/passwd | sed 's/\([^:]*\).*/\1/g'

Seda saab tõesti teha ühe regulaaravaldisega, kuid viis, kuidas seda teha, läheb kaugemale sellest, mida olen teile nendes artiklites öelnud, nii et olen seda teinud kahe käsu ühendamisega.

  • Sisestage koma numbrifaili kõigi numbrite kolme viimase numbri ette:

sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' numbers

See töötab ainult kuni 6-kohaliste numbritega, kuid seda saab helistada rohkem kui üks kord, kui eraldajaid paigutatakse teistesse kolmekohalistesse rühmadesse.

  •  Eemaldage failist kõik e-posti aadressid:

grep -E '\<[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\>' FICHERO

  • Eraldage kõigi failis kuvatavate kuupäevade päev, kuu ja aasta:

sed -r 's/([0-9]{2})[/-]([0-9]{2})[/-]([0-9]{4})/Día: \1, Mes: \2, Año: \3/g' FICHERO

  • Uurige meie kohalikku IP-d:

/sbin/ifconfig | grep 'inet .*broadcast' | sed -r 's/[^0-9]*(([0-9]+\.){3}[0-9]+).*/\1/g'

Seda saab teha ka ühe sed käsuga, kuid lihtsuse huvides eraldan selle parem grepiks ja sediks.

Mõned kasulikud aadressid

Siin on mõned regulaaravaldistega seotud aadressid, mis võivad olla kasulikud:

  • Regulaaravaldiste kogu: See on regulaaravaldiste kogu, kust saate otsida regulaaravaldisi, mis on seotud teid huvitava teemaga. Veebiaadresside, ID-de või muu otsimiseks.
  • RegExr: Veebipõhine regulaaravaldise kontrollija. See võimaldab teil sisestada teksti ja rakendada sellele regulaaravaldist kas otsimiseks või asendamiseks. See annab teavet regulaaravaldise kohta ja teil on selle käitumise muutmiseks mõned võimalused.
  • Regulaaravaldiste tester: See on Firefoxi lisand, mis võimaldab teil brauseris regulaaravaldisi kontrollida.

Järeldus

Praegu on see kõik. Regulaaravaldised on keerukad, kuid kasulikud. Nende õppimine võtab aega, kuid kui sa oled nagu mina, siis tundub nendega mängimine tore ja vähehaaval sa õpid neid ka valdama. See on terve maailm. Palju oleks veel öelda, laisate kvantorite, PERL-stiilis regexi, mitmerealiste jms kohta. Ja siis on igal programmil oma omadused ja variandid, nii et parim nõuanne, mida saan teile anda, on alati vaadata programmi dokumentatsiooni, mida kasutate, iga kord, kui peate uude programmi regulaaravaldise kirjutama.

Hei! ... Tere! … ÄRKA ÜLES! ... MIDA TE KÕIK MAGATE? 🙂

allikad

Mõned selle artikli regulaarsete väljendite ideed ja näited, mille olen siit võtnud:


Jäta oma kommentaar

Sinu e-postiaadressi ei avaldata. Kohustuslikud väljad on tähistatud *

*

*

  1. Andmete eest vastutab: Miguel Ángel Gatón
  2. Andmete eesmärk: Rämpsposti kontrollimine, kommentaaride haldamine.
  3. Seadustamine: teie nõusolek
  4. Andmete edastamine: andmeid ei edastata kolmandatele isikutele, välja arvatud juriidilise kohustuse alusel.
  5. Andmete salvestamine: andmebaas, mida haldab Occentus Networks (EL)
  6. Õigused: igal ajal saate oma teavet piirata, taastada ja kustutada.

  1.   elav DIJO

    Meisterlikult !!!

    1.    hexborg DIJO

      See pole nii hull, aga tänan teid väga. Loodetavasti inimestele see meeldib. 🙂

      1.    Oscar DIJO

        Mulle meeldib see ha!

        1.    hexborg DIJO

          Siis olen vist midagi õigesti teinud. LOL !! 🙂

          Suur aitäh kommentaari eest.

          1.    Blaire pascal DIJO

            Persse, kirjuta, jätka meest.

          2.    hexborg DIJO

            @Blaire Pascal: teiesugused kommentaarid julgustavad seda. 🙂 suur aitäh !!

      2.    Linn DIJO

        Mulle ka meeldis ... aitäh 🙂

        1.    hexborg DIJO

          Tänan kommentaari eest. Loodan veel paar kirjutada. 🙂

  2.   Marian DIJO

    Sinu postitused on fantastilised, õpid palju, pigem õpid ülesandeid elegantselt ja tõhusalt täitma.

    Kas olete mõelnud kõigi oma shelliskriptide postituste kogumisest? Sortimine pdf-vormingus oleks suurepärane käsiraamat.

    Terviseks ja suur aitäh!

    1.    hexborg DIJO

      Tänud!! See pole halb mõte. Praegu on neid ainult kaks, kuid ma mõtlen sellele hiljem. 🙂

  3.   Kijov DIJO

    väga hea artikkel, 5+.

    1.    hexborg DIJO

      Aitäh. Ma olen rõõmus, et sulle meeldib. 🙂

  4.   Sebastian DIJO

    Suurepärane! Pean muutma järgmist väljendit ja ma ei tea, kuidas seda teha:
    192.168.0.138/Server 192.168.0.111/andmed
    Probleem seisneb sümbolis "/".
    Kasutan käsku:
    leidma. -nimi "* .txt" -exec sed -i 's / TEXT1 / TEXT2 / g' {} \;
    Mida kasutatakse seda tüüpi ülesannete halvakspanemiseks, kuid ma ei saa ...
    Kas keegi teab, kuidas ma peaksin seda tegema?
    Kallistama!
    Seba

    1.    hexborg DIJO

      Mida peate tegema, on sellisest tegelasest põgeneda:

      leidma. -nimi "* .txt" -exec sed -i 's / \ / server / \ / data / g' {} \;

      Võite kasutada ka teist eraldajat sed. See ei pea olema baar. Sed lubab kasutada mis tahes märki. Näiteks oleks see selgem:

      leidma. -nimi "* .txt" -exec sed -i 's / Server | / data | g' {} \;

      Ja kui kavatsete sellest kommentaarist käsud kopeerida ja kleepida, siis pidage jutumärkidega ettevaatlikuks, et wordpress muudab need tüpograafilisteks. 🙂

      Tervitused.

  5.   Sebastian DIJO

    Suurepärane !!!!
    Olen seda lahendust pikka aega otsinud.
    Siin jätan kogu käsu, mida olen kasutanud

    leidma. -nimi "* .txt" -exec sed -i s | 192 \ .168 \ .0 \ .238 \ / Server | 192 \ .168 \ .0 \ .111 \ / data | g '{} \;

    Selle käsu eeliseks on see, et see muudab kõiki .txt-faile (või soovitud laiendit) rekursiivselt ... Peate olema väga ettevaatlik!
    Kuid see on väga kasulik !!!

    Noh, tänud kõige eest ja tuhat õnne kogu grupile.
    Ma loen neid alati postist!
    Kallistused
    Seba