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ä:
- http://sed.sourceforge.net/sed1line.txt
- http://www.thegeekstuff.com/2009/10/unix-sed-tutorial-advanced-sed-substitution-examples/
Mestarillinen!!!
Se ei ole iso juttu, mutta kiitos paljon Toivottavasti ihmiset pitävät siitä. 🙂
Pidän siitä ha!
Sitten olen varmasti tehnyt jotain oikein. LOL!! 🙂
Kiitos paljon kommentistasi.
Vittu jatka kirjoittamista mies, jatka sitä.
@Blaire Pascal: Sinun kaltaiset kommentit kannustavat sitä. 🙂 Kiitos paljon !!
Pidin siitä myös ... kiitos 🙂
Kiitos kommentista. Toivon voivani kirjoittaa muutaman lisää. 🙂
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!
Kiitos paljon!! Se ei ole huono idea. Tällä hetkellä niitä on vain kaksi, mutta ajattelen sitä myöhemmin. 🙂
erittäin hyvä artikkeli, 5+.
Kiitos. Olen iloinen että pidät siitä. 🙂
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
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.
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