Päätteellä: Säännöllisten lausekkeiden II käyttäminen: Korvaukset

Itsessäni artículo etupäätä Olen kertonut sinulle perustasolla, kuinka kaikki säännöllisten lausekkeiden eniten käytetyt erikoismerkit toimivat. Näiden säännöllisten lausekkeiden avulla on mahdollista tehdä monimutkaisia ​​hakuja tekstitiedostoista tai muiden komentojen lähdöistä. Tässä artikkelissa aion selittää, miten sed-komentoa käytetään tekstin etsimiseen ja korvaamiseen paljon tehokkaammalla tavalla kuin yksinkertaisesti yhden tekstin vaihtaminen toiseen.

Hieman lisää grep-komennosta

Ennen kuin aloitan sedistä, haluaisin kommentoida hieman enemmän grep-komennosta, jotta edellisessä artikkelissa selitettiin hieman. Kaikella, mitä sanon, on merkitystä myös tässä. Myöhemmin näemme tämän ja hakujen välisen suhteen.

Yhdistämällä säännölliset lausekkeet

Monet erikoismerkeistä, joista olen puhunut edellisessä artikkelissa, voidaan yhdistää paitsi muiden hahmojen kanssa myös kokonaisin säännöllisin lausekkein. Tapa tehdä tämä on käyttää sulkeita alilausekkeen muodostamiseksi. Katsotaanpa esimerkki tästä. Aloitetaan lataamalla teksti, jota voimme käyttää testaamiseen. Se on luettelo lauseista. Tätä varten aiomme käyttää seuraavaa komentoa:

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

 Tämä jättää sinut hakemistoon, jossa käynnistät tiedoston nimeltä «lauseet». Voit avata sen katsomaan ja nauramaan. 🙂

Oletetaan nyt, että haluamme löytää lauseet, joissa on täsmälleen 6 sanaa. Vaikeus on muodostaa säännöllinen lauseke, joka vastaa kutakin sanaa. Sana on kirjainsarja, joko isoja tai pieniä, mikä olisi jotain '[a-zA-Z]+', mutta sinun on myös määriteltävä, että nämä kirjaimet on erotettava muilla merkeillä kuin kirjaimilla, eli se olisi jotain '[a-zA-Z]+[^a-zA-Z]+'. Muistetaan: "^" suluissa ensimmäisenä merkkinä ilmaisee, että haluamme sovittaa merkkeihin, jotka eivät kuulu alueisiin, ja "+" tarkoittaa yhtä tai useampaa merkkiä.

Meillä on jo säännöllinen lauseke, joka vastaa sanaa. Yhdistääksesi sen 6: een, se on toistettava 6 kertaa. Siihen käytimme avaimet, mutta on turha laittaa '[a-zA-Z]+[^a-zA-Z]+{6}', koska 6 toistaisi säännöllisen lausekkeen viimeisen osan ja haluamme toistaa kaiken, joten meidän on laitettava tämä: '([a-zA-Z]+[^a-zA-Z]+){6}'. Suluilla muodostamme alilausekkeen ja aaltosulkeilla toistamme sen 6 kertaa. Nyt sinun tarvitsee vain lisätä "^" eteen ja "$" taakse vastaamaan koko riviä. Komento on seuraava:

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

Ja tulos on juuri se, mitä halusimme:

Se on laulettu enemmän kuin Macarena. Olet enemmän valmis kuin Luis Aguilé. Sinulla on vähemmän kulttuuria kuin kiven. Tiedät enemmän kieliä kuin Cañita Brava. Hänellä on enemmän ryppyjä kuin Tutan Khamónilla. Tiedät vähemmän kuin Rambo lastenhoidosta.

Huomaa, että laitamme parametrin -E, koska haluamme käyttää laajennettuja säännöllisiä lausekkeita "+": n tekemiseksi. Jos käytämme perusluonteisia, meidän on vältettävä sulkeita ja aaltosulkeita.

Takaviitteet tai viittaukset

Jos sinulla on asennettuna oikeinkirjoituksen tarkistus, sinulla on todennäköisesti luettelo sanoista /usr/share/dict/words. Jos ei, voit asentaa sen arch: iin seuraavilla tavoilla:

sudo pacman -S words

Tai debianissa:

sudo aptitude install dictionaries-common

Jos haluat, voit katsella tiedostoa nähdäksesi mitä sanoja siinä on. Itse asiassa se on linkki sen kielen sanatiedostoon, jolla distro on. Voit asentaa useita sanatiedostoja samanaikaisesti.

Aiomme käyttää tätä tiedostoa. On käynyt ilmi, että olemme erittäin uteliaita tuntemaan kaikki seitsemän kirjaimen palindromit. Niille, jotka eivät tiedä: Palindromi on capicúa-sana, eli se voidaan lukea sekä vasemmalta oikealle että oikealta vasemmalle. Kokeillaan seuraavaa komentoa:

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

Se näyttää vähän oudolta, eikö? Jos kokeilemme sitä, tulos riippuu distron kielestä ja luettelossasi olevista sanoista, mutta minun tapauksessani espanjan kielellä tulos on seuraava:

aniliinin aniliinin valssaus

Katsotaanpa, kuinka tämä säännöllinen lauseke toimii.

"^": N ja "$": n lisäksi, jotka tiedämme jo, mihin se on tarkoitettu, vasemmassa reunassa näkyvät ensin kolme sulkuihin suljettua pisteryhmää. Älä sekoita kunkin sulun edessä olevilla palkeilla. Heidän on vältettävä sulkeita, koska käytämme säännöllisiä peruslausekkeita, mutta niillä ei ole muuta merkitystä. Tärkeää on, että pyydämme kaikkia kolmea merkkiä, joissa on pisteitä, mutta jokainen näistä pisteistä on sulkeissa. Tämä on tarkoitus tallentaa merkkejä, jotka vastaavat näitä pisteitä, jotta niihin voidaan viitata uudelleen säännöllisestä lausekkeesta. Tämä on toinen sulkujen käyttö, joka on hyödyllinen myöhemmin korvausten tekemisessä.

Tässä alla olevat kolme numeroa tulevat vinoviivalla edessä. Tässä tapauksessa palkki on tärkeä. Sitä käytetään osoittamaan, että alla oleva numero on taustareuna ja viittaa yhteen edellisistä sulkeista. Esimerkiksi: \ 1 viittaa ensimmäiseen sulkeeseen, \ 2 toiseen ja niin edelleen.

Toisin sanoen etsimämme ovat säännöllisen lausekkeen avulla kaikki sanat, jotka alkavat millä tahansa neljällä kirjaimella ja joiden kirjain on sama kuin kolmas, toinen on sama kuin toinen ja toinen on sama kuin ensimmäinen. Tuloksena on seitsemän kirjaimen palindromi, jotka ovat sanaluettelossa. Aivan kuten halusimme.

Jos käytämme laajennettuja säännöllisiä lausekkeita, sulkeita ei tarvitse välttää, mutta laajennetuilla säännöllisillä lausekkeilla taustaviitteet eivät toimi kaikissa ohjelmissa, koska niitä ei ole standardoitu. Grepillä ne kuitenkin toimivat, joten se voi olla toinen tapa tehdä sama. Voit kokeilla sitä, jos haluat.

Korvauslausekkeet: sed-komento

Haun lisäksi säännöllisten lausekkeiden yksi parhaimmista käyttötavoista on korvata monimutkaiset tekstit. Yksi tapa tehdä se on sed-komento. Sed-komennon voima ylittää paljon tekstin korvaamisen, mutta tässä aion käyttää sitä siihen. Syntaksi, jota aion käyttää tässä komennossa, on seuraava:

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

Tai myös:

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

Missä REGEX on haun säännöllinen lauseke ja REPL korvaava lauseke. Muista, että tämä komento ei todellakaan korvaa mitään ilmoitetusta tiedostosta, mutta mitä se tekee, näyttää meille päätelaitteen korvaamisen tuloksen, joten älä pelkää komentoja, jotka aion tehdä seuraavaksi. Kukaan heistä ei aio muokata mitään tiedostoja järjestelmässäsi.

Aloitetaan yksinkertaisella esimerkillä. Meillä kaikilla on / etc-hakemistossa erilaisia ​​kokoonpanotiedostoja, joissa on yleensä "#" - alkuisia kommentteja. Oletetaan, että haluamme nähdä yhden näistä tiedostoista ilman kommentteja. Esimerkiksi aion tehdä sen fstabin kanssa. Voit kokeilla haluamasi kanssa.

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

En aio laittaa tähän komennon tulosta, koska se riippuu siitä, mitä sinulla on fstabissa, mutta jos verrataan komennon tulosta tiedoston sisältöön, näet, että kaikki kommentit ovat kadonneet.

Tässä komennossa hakulauseke on «#.*", Se on" # ", jota seuraa mikä tahansa määrä merkkejä, ts. Kommentit. Ja korvaava lauseke, jos tarkastelet kahta palkkia peräkkäin, huomaat, että niitä ei ole, joten se tekee korvaavan kommentit ei mitään, eli poistamalla ne. Yksinkertaisesti mahdotonta.

Nyt aiomme tehdä päinvastoin. Oletetaan, että haluamme kommentoida tiedoston kaikkia rivejä. Yritetään näin:

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

Näet, että komentolähdössä kaikki rivit alkavat hash-merkillä ja tyhjällä välillä. Se, mitä olemme tehneet, on korvata rivin alku sanalla «# «. Tämä on myös melko yksinkertainen esimerkki, jossa korvattava teksti on aina sama, mutta nyt monimutkaistamme sitä hieman enemmän.

Korvausten armo on, että korvauslausekkeessa voit käyttää taustaviitteitä, kuten sanoin sinulle aiemmin. Palataan takaisin lauseetiedostoon, jonka latasimme artikkelin alussa. Aiomme laittaa sulkeisiin kaikki olemassa olevat isot kirjaimet, mutta teemme sen komennolla:

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

Tässä meillä on taustareferenssi korvauslausekkeessa, joka viittaa hakulausekkeen sulkeisiin. Korvauslausekkeen sulkeet ovat normaaleja sulkeita. Korvauslausekkeella heillä ei ole erityistä merkitystä, ne laitetaan sellaisenaan. Tuloksena on, että kaikki isot kirjaimet korvataan samalla kirjaimella, riippumatta siitä, mikä se on, suluilla sen ympärillä.

On myös toinen merkki, jota voidaan käyttää myös korvauslausekkeessa, se on "&" ja se korvataan kaikella tekstillä, johon hakulauseke vastaa. Esimerkki tästä voi olla kaikkien tiedostossa olevien lauseiden laittaminen lainausmerkkeihin. Tämä voidaan saavuttaa tällä komennolla:

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

Tämän komennon toiminta on hyvin samanlainen kuin edellinen, vain nyt korvataan koko rivi samalla rivillä, jonka ympärillä on lainausmerkkejä. Koska käytämme "&" -merkkiä, sulkeita ei tarvitse laittaa.

Joitakin hyödyllisiä komentoja säännöllisin lausekkein

Tässä on muutama komento, jotka ovat mielestäni hyödyllisiä tai uteliaita ja joissa käytetään säännöllisiä lausekkeita. Näillä komennoilla säännöllisten lausekkeiden hyödyllisyys on paljon parempi kuin esimerkkeissä, jotka olen antanut sinulle tähän mennessä, mutta minusta tuntui tärkeältä selittää jotain säännöllisten lausekkeiden toiminnasta ymmärtääksesi ne.

  • Näytä man-sivun osiot:

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

Tietenkin voit vaihtaa bash-komennon mihin tahansa. Ja sitten ihmiseltä, voit siirtyä suoraan sinua kiinnostavaan osioon käyttämällä tietysti säännöllistä lauseketta. Aloita haku ja kirjoita «/» painamalla «/»^ALIASES$»Siirtyminen esimerkiksi ALIASES-osioon. Luulen, että tämä on ensimmäinen käyttö, jonka aloin käyttää säännöllisiä lausekkeita muutama vuosi sitten. Käsikirjan joidenkin sivujen selaaminen on melkein mahdotonta ilman tällaista temppua.

  • Näytä kaikkien koneen käyttäjien nimet, mukaan lukien erikoiskäyttäjät:

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

  • Näytä käyttäjänimet, mutta vain ne, joilla on kuori:

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

Se voidaan todella tehdä yhdellä säännöllisellä lausekkeella, mutta tapa tehdä se ylittää sen, mitä olen kertonut sinulle näissä artikkeleissa, joten olen tehnyt sen yhdistämällä kaksi komentoa.

  • Lisää pilkku numerotiedoston kaikkien numeroiden kolmen viimeisen numeron eteen:

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

Se toimii vain enintään 6-numeroisten numeroiden kanssa, mutta sitä voidaan kutsua useammin kuin kerran sijoittamaan erottimet muihin kolmen numeron ryhmiin.

  •  Pura kaikki sähköpostiosoitteet tiedostosta:

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

  • Erota kaikkien tiedostossa näkyvien päivämäärien päivä, kuukausi ja vuosi:

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

  • Selvitä paikallinen IP-osoitteemme:

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

Tämä voidaan tehdä myös yhdellä sed-komennolla, mutta erottelen sen paremmin grepiksi ja sediksi yksinkertaisuuden vuoksi.

Joitakin hyödyllisiä osoitteita

Tässä on joitain osoitteita, jotka voivat olla hyödyllisiä säännöllisten lausekkeiden yhteydessä:

  • Säännöllisen lausekkeen kirjasto: Tämä on säännöllisten lausekkeiden kirjasto, josta voit etsiä säännöllisiä lausekkeita, jotka liittyvät sinua kiinnostavaan aiheeseen. Voit etsiä verkko-osoitteita, tunnuksia tai mitä tahansa.
  • RegExr: Online-säännöllisen lausekkeen tarkistaja. Sen avulla voit kirjoittaa tekstiä ja soveltaa siihen säännöllistä lauseketta joko hakemalla tai korvaamalla. Se antaa tietoja säännöllisestä lausekkeesta ja sinulla on muutama vaihtoehto muuttaa sen käyttäytymistä.
  • Säännöllisten lausekkeiden testaaja: Se on Firefoxin lisäosa, jonka avulla voit tarkistaa säännölliset lausekkeet selaimesta.

Johtopäätös

Toistaiseksi siinä kaikki. Säännölliset lausekkeet ovat monimutkaisia, mutta hyödyllisiä. Niiden oppiminen vie aikaa, mutta jos olet kuin minä, heidän kanssaan pelaaminen tuntuu hauskalta ja vähitellen hallitset heidät. Se on koko maailma. Siellä olisi vielä paljon sanottavaa laiskoista kvantifikaattoreista, PERL-tyylisestä regexistä, monirivistä jne. Ja sitten jokaisella ohjelmalla on sen ominaisuudet ja muunnelmat, joten paras neuvo, jonka voin antaa sinulle, on aina tarkastella käyttämäsi ohjelman dokumentaatiota joka kerta, kun joudut kirjoittamaan säännöllisen lausekkeen uuteen ohjelmaan.

Hei! …HEI! … HERÄTÄ! … MITÄ TE NÄYTÄT NUKKUVAT? 🙂

lähteet

Joitakin tämän artikkelin ideoita ja esimerkkejä säännöllisistä lausekkeista, jotka olen ottanut täältä:


Jätä kommentti

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *

*

*

  1. Vastuussa tiedoista: Miguel Ángel Gatón
  2. Tietojen tarkoitus: Roskapostin hallinta, kommenttien hallinta.
  3. Laillistaminen: Suostumuksesi
  4. Tietojen välittäminen: Tietoja ei luovuteta kolmansille osapuolille muutoin kuin lain nojalla.
  5. Tietojen varastointi: Occentus Networks (EU) isännöi tietokantaa
  6. Oikeudet: Voit milloin tahansa rajoittaa, palauttaa ja poistaa tietojasi.

  1.   vilkas dijo

    Mestarillinen!!!

    1.    hexborg dijo

      Se ei ole iso juttu, mutta kiitos paljon Toivottavasti ihmiset pitävät siitä. 🙂

      1.    oscar dijo

        Pidän siitä ha!

        1.    hexborg dijo

          Sitten olen varmasti tehnyt jotain oikein. LOL!! 🙂

          Kiitos paljon kommentistasi.

          1.    Blaire pascal dijo

            Vittu jatka kirjoittamista mies, jatka sitä.

          2.    hexborg dijo

            @Blaire Pascal: Sinun kaltaiset kommentit kannustavat sitä. 🙂 Kiitos paljon !!

      2.    Kaupunki dijo

        Pidin siitä myös ... kiitos 🙂

        1.    hexborg dijo

          Kiitos kommentista. Toivon voivani kirjoittaa muutaman lisää. 🙂

  2.   Marian dijo

    Viestisi ovat upeita, opit paljon, vaan opit suorittamaan tehtäviä tyylikkäästi ja tehokkaasti.

    Oletko ajatellut kerätä kaikki komentosarjakomennot? Lajittelu pdf-muodossa tekisi upean käyttöoppaan.

    Kippis ja kiitos paljon!

    1.    hexborg dijo

      Kiitos paljon!! Se ei ole huono idea. Tällä hetkellä niitä on vain kaksi, mutta ajattelen sitä myöhemmin. 🙂

  3.   Kijov dijo

    erittäin hyvä artikkeli, 5+.

    1.    hexborg dijo

      Kiitos. Olen iloinen että pidät siitä. 🙂

  4.   sebastian dijo

    Erinomainen! Minun täytyy muuttaa seuraava lauseke enkä tiedä miten se tehdään:
    192.168.0.138/Server mennessä 192.168.0.111/data
    Ongelma on symbolissa "/".
    Käytän komentoa:
    löytö. -nimi "* .txt" -exec sed -i 's / TEXT1 / TEXT2 / g' {} \;
    Mitä tämän tyyppisen tehtävän suorittamiseen käytetään valitettavasti, mutta en voi ...
    Tietääkö kukaan, kuinka minun pitäisi tehdä se?
    Halata!
    Seba

    1.    hexborg dijo

      Sinun on tehtävä paeta näin oleva merkki:

      löytö. -nimi "* .txt" -exec sed -i: n / \ / palvelin / \ / data / g '{} \;

      Voit käyttää myös toista erotinta sed. Sen ei tarvitse olla baari. Sed sallii minkä tahansa merkin käytön. Esimerkiksi tämä olisi selvempi:

      löytö. -name "* .txt" -exec sed -i: n | / Palvelin | / data | g '{} \;

      Ja jos aiot kopioida ja liittää tämän kommentin komennot, ole varovainen lainausmerkkien suhteen, että wordpress muuttaa ne typografisiksi. 🙂

      Tervehdys.

  5.   sebastian dijo

    Erinomainen!!!!
    Olen etsinyt tätä ratkaisua pitkään.
    Täällä jätän koko käyttämäni komennon

    löytö. -nimi "* .txt" -exec sed -i: t | 192 \ .168 \ .0 \ .238 \ / Palvelin | 192 \ .168 \ .0 \ .111 \ / data | g '{} \;

    Tämän komennon etuna on, että se muuttaa kaikki .txt-tiedostot (tai haluamasi laajennuksen) rekursiivisesti ... Sinun on oltava hyvin varovainen!
    Mutta se on erittäin hyödyllinen !!!

    Kiitos kaikesta ja tuhat onnittelua koko ryhmälle.
    Luen ne aina postista!
    halauksia
    Seba