Me Terminal: Përdorimi i Shprehjeve të Rregullta II: Zëvendësimet

Në veten time artikulli i mëparshëm Unë ju kam treguar në një nivel bazë se si funksionon secili prej personazheve të veçantë më të përdorur të shprehjeve të rregullta. Me këto shprehje të rregullta është e mundur të bëhen kërkime komplekse në skedarët e tekstit ose në daljen e komandave të tjera. Në këtë artikull unë do të shpjegoj se si të përdorësh komandën sed për të gjetur dhe zëvendësuar tekstin në një mënyrë shumë më të fuqishme sesa thjesht ndryshimin e një teksti për një tjetër.

Pak më shumë rreth komandës grep

Para se të filloj të flas për sed, unë do të doja të komentoja pak më shumë rreth komandës grep për të përfunduar pak atë që u shpjegua në artikullin e mëparshëm. Gjithçka që do të them do të jetë e rëndësishme edhe për këtë. Më vonë do të shohim marrëdhëniet midis kësaj dhe kërkimeve.

Kombinimi i shprehjeve të rregullta

Shumë nga personazhet e veçantë për të cilët kam folur në artikullin e mëparshëm mund të kombinohen, jo vetëm me personazhe të tjerë, por me shprehje të tëra të rregullta. Mënyra për ta bërë këtë është përdorimi i kllapave për të formuar një nën shprehje. Le të shohim një shembull të kësaj. Le të fillojmë duke shkarkuar një tekst që mund ta përdorim për provë. Isshtë një listë frazash. Për këtë ne do të përdorim komandën e mëposhtme:

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

 Kjo do t'ju lërë në direktorinë ku nisni një skedar me emrin «fraza». Mund ta hapni për të hedhur një vështrim dhe për të qeshur pak. 🙂

Tani le të supozojmë se duam të gjejmë frazat që kanë saktësisht 6 fjalë. Vështirësia është në formimin e një shprehje të rregullt që përputhet me secilën fjalë. Një fjalë është një sekuencë e shkronjave, ose e madhe ose e vogël, e cila do të ishte diçka e ngjashme '[a-zA-Z]+', por gjithashtu duhet të specifikoni që këto shkronja duhet të ndahen nga karaktere të tjerë përveç shkronjave, domethënë do të ishte diçka e ngjashme '[a-zA-Z]+[^a-zA-Z]+'. Mos harroni: "^" si karakteri i parë brenda kllapave tregon se duam të përputhemi me karaktere që nuk janë në interval dhe "+" tregon 1 ose më shumë karaktere.

Ne tashmë kemi një shprehje të rregullt që mund të përputhet me një fjalë. Për ta çiftuar me 6, do të duhet të përsëritet 6 herë. Për këtë ne kemi përdorur çelësat, por është e padobishme të vendosen '[a-zA-Z]+[^a-zA-Z]+{6}', sepse 6 do të përsërisnin pjesën e fundit të shprehjes së rregullt dhe ajo që duam është të përsërisim të gjitha, kështu që ajo që duhet të vendosim është kjo: '([a-zA-Z]+[^a-zA-Z]+){6}'. Me kllapa formojmë një nën shprehje dhe me mbajtëset e përsërisim 6 herë. Tani thjesht duhet të shtoni një "^" përpara dhe një "$" në pjesën e pasme për t'u përputhur me të gjithë vijën. Komanda është si më poshtë:

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

Dhe rezultati është vetëm ajo që donim:

Këndohet më shumë se Macarena. Ju jeni më të mbaruar se Luis Aguilé. Ju keni më pak kulturë se një gur. Ju dini më shumë gjuhë se Cañita Brava. Ai ka më shumë rrudha sesa Tutan Khamón. Ju dini më pak se Rambo për kujdesin ndaj fëmijëve.

Vini re se vendosim parametrin -E sepse duam të përdorim shprehje të rregullta të zgjeruara për ta bërë funksionimin "+". Nëse do të përdornim ato themelore, do të na duhet të shpëtojmë nga kllapat dhe mbajtëset.

Referencat e pasme ose referimet prapa

Nëse keni të instaluar një kontrollues drejtshkrimi, me siguri do të keni një listë fjalësh në /usr/share/dict/words. Nëse jo, mund ta instaloni në hark me:

sudo pacman -S words

Ose në debian me:

sudo aptitude install dictionaries-common

Nëse dëshironi mund t’i hidhni një sy skedarit për të parë se çfarë fjalësh ka. Në të vërtetë është një lidhje me skedarin e fjalës të gjuhës në të cilën është distro juaj. Mund të keni të instaluar disa skedarë fjalësh në të njëjtën kohë.

Ne do ta përdorim atë skedar. Rezulton se ne jemi shumë kuriozë të njohim të shtatë palindromat e shkronjave atje. Për ata që nuk e dinë: Një palindrom është një fjalë kapicë, domethënë, mund të lexohet nga e majta në të djathtë, si dhe nga e djathta në të majtë. Le të provojmë komandën e mëposhtme:

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

Duket pak e çuditshme, apo jo? Nëse e provojmë, rezultati do të varet nga gjuha e distroit tuaj dhe fjalët që janë në listën tuaj, por në rastin tim, me gjuhën spanjolle, rezultati është ky:

anilina anilina kodrina

Le të shohim se si funksionon kjo shprehje e rregullt.

Përveç "^" dhe "$", të cilat ne tashmë e dimë se për çfarë është, gjëja e parë që shohim në të majtë janë tre grupe pikash të mbyllura në kllapa. Mos u hutoni nga shiritat përpara çdo kllapi. Ato duhet të shpëtojnë nga kllapat sepse po përdorim shprehje themelore të rregullta, por ato nuk kanë ndonjë kuptim tjetër. Gjëja e rëndësishme është që ne po kërkojmë ndonjë tre karaktere me pika, por secila prej atyre pikave është e mbyllur në kllapa. Kjo është për të ruajtur karakteret që përputhen me ato pika në mënyrë që ata të mund të referohen përsëri nga shprehja e rregullt. Ky është një përdorim tjetër i kllapave që do t'ju vijnë në ndihmë më vonë për të bërë zëvendësime.

Kjo është ajo ku tre numrat më poshtë vijnë me prerjen përpara tyre. Në këtë rast, shiriti është i rëndësishëm. Shtë përdorur për të treguar që numri më poshtë është një referencë prapa dhe i referohet njërës prej kllapave të mëparshme. Për shembull: \ 1 i referohet kllapës së parë, \ 2 tjetrës, etj.

Kjo është, me shprehjen e rregullt që kemi vendosur, ato që ne po kërkojmë janë të gjitha fjalët që fillojnë me çdo katër shkronja dhe pastaj kanë një letër që është e njëjtë me të tretën, një tjetër që është e njëjtë me të dytën dhe një tjetër që është e njëjtë me së pari Rezultati është palindromet me shtatë shkronja që janë në listën e fjalëve. Ashtu siç donim ne.

Nëse do të përdornim shprehje të rregullta të zgjatura, kllapat nuk do të duhej të shpëtonin, por me shprehje të rregullta të zgjeruara, referencat e pasme nuk funksionojnë në të gjitha programet sepse ato nuk janë të standardizuara. Sidoqoftë, me grep ato funksionojnë, kështu që kjo mund të jetë një mënyrë tjetër për të bërë të njëjtën gjë. Mund ta provoni nëse dëshironi.

Shprehjet e zëvendësimit: komanda sed

Përveç kërkimit, një nga përdorimet më të mira të shprehjeve të rregullta është zëvendësimi i teksteve komplekse. Për ta bërë këtë, një mënyrë për ta bërë atë është me komandën sed. Fuqia e komandës sed shkon përtej zëvendësimit të tekstit, por këtu unë do ta përdor atë për këtë. Sintaksa që do të përdor me këtë komandë është si më poshtë:

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

Ose gjithashtu:

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

Aty ku REGEX do të jetë shprehja e rregullt e kërkimit dhe REPL-ja atë zëvendësuese. Mbani në mend se kjo komandë nuk zëvendëson asgjë në skedarin që ne tregojmë, por ajo që bën është të na tregojë rezultatin e zëvendësimit në terminal, kështu që mos u frikësoni nga komandat që do të vendos më tej. Asnjë prej tyre nuk do të modifikojë ndonjë skedar në sistemin tuaj.

Le të fillojmë me një shembull të thjeshtë. Të gjithë kemi skedarë të ndryshëm konfigurimi në direktorinë / etj që zakonisht kanë komente që fillojnë me "#". Supozoni se duam të shohim një nga këto skedarë pa komente. Për shembull, unë do ta bëj atë me fstab. Mund të provoni me atë që dëshironi.

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

Unë nuk do të vë këtu rezultatin e komandës sepse kjo varet nga ajo që keni në fstab tuaj, por nëse krahasoni prodhimin e komandës me përmbajtjen e skedarit do të shihni se të gjitha komentet janë zhdukur.

Në këtë komandë shprehja e kërkimit është «#.*", Kjo është një" # "e ndjekur nga çdo numër karakteresh, domethënë komentet. Dhe shprehja zëvendësuese, nëse shikoni dy shiritat me radhë, do të shihni se nuk ka asnjë, kështu që ajo që po bën është të zëvendësojë komentet me asgjë, domethënë t'i fshijë ato. Më e thjeshtë e pamundur.

Tani do të bëjmë të kundërtën. Supozoni se ajo që duam është të komentojmë të gjitha linjat e skedarit. Le të provojmë kështu:

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

Ju do të shihni se, në daljen e komandës, të gjitha linjat fillojnë me një shenjë hashe dhe një hapësirë ​​të zbrazët. Ajo që kemi bërë është të zëvendësojmë fillimin e rreshtit me «# « Ky është gjithashtu një shembull mjaft i thjeshtë ku teksti që do të zëvendësohet është gjithmonë i njëjtë, por tani ne do ta komplikojmë atë edhe më shumë.

Hiri i zëvendësimeve është se në shprehjen e zëvendësimit mund të përdorni referenca prapa si ato që ju thashë më parë. Le të kthehemi te skedari i frazës që shkarkuam në fillim të artikullit. Ne do të vendosim në kllapa të gjitha shkronjat e mëdha që ekzistojnë, por ne do ta bëjmë atë me një komandë:

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

Ajo që kemi këtu është një referim prapa në shprehjen zëvendësuese që i referohet kllapave në shprehjen e kërkimit. Kllapat në shprehjen zëvendësuese janë kllapa normale. Në shprehjen zëvendësuese ato nuk kanë ndonjë kuptim të veçantë, ato vendosen ashtu siç është. Rezultati është që të gjitha shkronjat e mëdha të zëvendësohen nga e njëjta shkronjë, cilado qoftë ajo, me kllapa përreth saj.

Ekziston një karakter tjetër që mund të përdoret gjithashtu në shprehjen zëvendësuese, ai është "&" dhe zëvendësohet nga i gjithë teksti që përputhet me shprehjen e kërkimit. Një shembull i kësaj mund të jetë vendosja e të gjitha frazave në skedar në thonjëza. Kjo mund të arrihet me këtë komandë:

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

Funksionimi i kësaj komande është shumë i ngjashëm me atë të mëparshëm, vetëm tani ajo që ne zëvendësojmë është e gjithë vija me të njëjtën linjë me thonjëza përreth saj. Meqenëse ne jemi duke përdorur "&", nuk është e nevojshme të vendosni kllapa.

Disa komanda të dobishme me shprehje të rregullta

Këtu janë disa komanda që më duken të dobishme ose kurioze dhe që përdorin shprehje të rregullta. Me këto komanda dobia e shprehjeve të rregullta është shumë më e mirë sesa me shembujt që ju kam dhënë deri më tani, por më dukej e rëndësishme të shpjegoja diçka se si funksionojnë shprehjet e rregullta për t'i kuptuar ato.

  • Trego pjesët e faqes së një burri:

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

Sigurisht, ju mund ta ndryshoni komandën bash në çfarë të doni. Dhe pastaj nga njeriu, ju mund të shkoni direkt në pjesën që ju intereson duke përdorur, natyrisht, një shprehje të rregullt. Shtypni «/» për të filluar kërkimin dhe shkruani «^ALIASES$»Për të shkuar në seksionin ALIASES, për shembull. Mendoj se ky është përdorimi i parë që kam filluar të bëj shprehje të rregullta disa vjet më parë. Lëvizja nëpër disa faqe të manualit është pothuajse e pamundur pa një hile të tillë.

  • Trego emrat e të gjithë përdoruesve të makinës duke përfshirë edhe ata të veçantë:

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

  • Trego emrat e përdoruesve, por vetëm ata me guaskë:

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

Mund të bëhet me të vërtetë me një shprehje të vetme të rregullt, por mënyra për ta bërë atë shkon përtej asaj që ju kam thënë në këto artikuj, kështu që unë e kam bërë atë duke kombinuar dy komanda.

  • Vendosni një presje para tre shifrave të fundit të të gjithë numrave në skedarin e numrave:

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

Punon vetëm me numra deri në 6 shifra, por mund të thirret më shumë se një herë për të vendosur ndarës në grupet e tjera me tre shifra.

  •  Nxjerrni të gjitha adresat e postës elektronike nga një skedar:

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

  • Ndani ditën, muajin dhe vitin e të gjitha datave që shfaqen në një skedar:

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

  • Gjeni IP-në tonë lokale:

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

Kjo gjithashtu mund të bëhet me një komandë të vetme sed, por më mirë ta ndaj atë në një grep dhe një sed për thjeshtësi.

Disa adresa të dobishme

Këtu janë disa adresa që mund të jenë të dobishme në lidhje me shprehjet e rregullta:

  • Biblioteka e shprehjeve të rregullta: Kjo është një bibliotekë e shprehjeve të rregullta në të cilën mund të kërkoni shprehje të rregullta në lidhje me temën që ju intereson. Për të kërkuar adresa në internet, ID ose çfarëdo tjetër.
  • RegExr: Një kontrollues i shprehjeve të rregullta në internet. Ju lejon të futni një tekst dhe të aplikoni një shprehje të rregullt në të, ose kërkoni ose zëvendësoni. Ai jep informacion në lidhje me shprehjen e rregullt dhe ju keni disa mundësi për të ndryshuar sjelljen e saj.
  • Testues i shprehjeve të rregullta: Shtë një shtesë për firefox që ju lejon të kontrolloni shprehjet e rregullta nga shfletuesi.

Përfundim

Tani për tani kjo është e gjitha. Shprehjet e rregullta janë komplekse por të dobishme. Duhet kohë për t’i mësuar, por nëse je si unë, loja me ta do të duket kënaqësi dhe, pak nga pak, do t’i zotërosh ato. Shtë një botë e tërë. Do të kishte shumë për të thënë akoma, për kuantifikuesit dembelë, regex në stilin PERL, multiline, etj. Dhe pastaj secili program ka karakteristikat e tij dhe variantet e tij, kështu që këshilla më e mirë që mund t'ju jap është të shikoni gjithmonë dokumentacionin e programit që po përdorni sa herë që duhet të shkruani një shprehje të rregullt në një program të ri.

Hej! … HEY! … ZGJOHU! … ÇFAR A JU BENI T ALL GJUM T GJITHA? 🙂

Fuentes

Disa nga idetë dhe shembujt për shprehjet e rregullta në këtë artikull i kam marrë nga këtu:


Lini komentin tuaj

Adresa juaj e emailit nuk do të publikohet. Fusha e kërkuar janë shënuar me *

*

*

  1. Përgjegjës për të dhënat: Miguel Ángel Gatón
  2. Qëllimi i të dhënave: Kontrolloni SPAM, menaxhimin e komenteve.
  3. Legjitimimi: Pëlqimi juaj
  4. Komunikimi i të dhënave: Të dhënat nuk do t'u komunikohen palëve të treta përveç me detyrim ligjor.
  5. Ruajtja e të dhënave: Baza e të dhënave e organizuar nga Occentus Networks (BE)
  6. Të drejtat: Në çdo kohë mund të kufizoni, rikuperoni dhe fshini informacionin tuaj.

  1.   i gjallë dijo

    Mjeshterisht !!!

    1.    heksborg dijo

      Nuk është aq keq, por faleminderit shumë. Shpresoj që njerëzit ta pëlqejnë atë. 🙂

      1.    Oscar dijo

        Më pëlqen ha!

        1.    heksborg dijo

          Atëherë duhet të kem bërë diçka si duhet. LOL !! 🙂

          Ju faleminderit shumë për komentin tuaj.

          1.    Bler Paskal dijo

            Qij vazhdo të shkruash njeri, vazhdo kështu.

          2.    heksborg dijo

            @Blaire Pascal: Komente si tuajat e inkurajojnë atë. 🙂 Faleminderit shumë !!

      2.    Qyteti dijo

        Edhe mua me pelqeu ... faleminderit

        1.    heksborg dijo

          Faleminderit per koment Shpresoj të shkruaj edhe disa të tjera. 🙂

  2.   Marian dijo

    Postimet tuaja janë fantastike, ju mësoni shumë, përkundrazi, mësoni të kryeni detyra në një mënyrë elegante dhe efikase.

    A keni menduar për mbledhjen e të gjitha postimeve tuaja të skenarit shell? Renditur në një pdf do të bënte një manual të shkëlqyeshëm.

    Gëzuar dhe faleminderit shumë!

    1.    heksborg dijo

      Faleminderit shume!! Nuk është një ide e keqe. Për momentin janë vetëm dy, por do ta mendoj më vonë. 🙂

  3.   Kiev dijo

    artikull shume i mire, 5+.

    1.    heksborg dijo

      Faleminderit. Me vjen mire qe ju pelqen. 🙂

  4.   sebastian dijo

    Shkëlqyeshëm! Unë kam nevojë të ndryshoj shprehjen e mëposhtme dhe nuk di si ta bëj:
    192.168.0.138/Server me 192.168.0.111/data
    Problemi qëndron në simbolin "/".
    Po përdor komandën:
    Gjej. -emri "* .txt" -exec sed -i's / TEXT1 / TEXT2 / g '{} \;
    Çfarë përdoret për të kryer këtë lloj detyre në mënyrë të largët, por nuk mund ta ...
    A e di dikush se si duhet ta bëj atë?
    Perqafo!
    Seba

    1.    heksborg dijo

      Ajo që duhet të bësh është t'i shpëtosh karakterit si kjo:

      Gjej. -emri "* .txt" -exec sed -i's / \ / Server / \ / data / g '{} \;

      Ju gjithashtu mund të përdorni një ndarës tjetër në sed. Nuk ka pse të jetë një lokal. Sed lejon që të përdoret çdo karakter. Për shembull, kjo do të ishte më e qartë:

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

      Dhe nëse do të kopjoni dhe ngjisni komandat nga ky koment, kini kujdes me thonjëzat, që wordpress i ndryshon ato për ato tipografike. 🙂

      Përshëndetje.

  5.   sebastian dijo

    Shkëlqyeshëm !!!!
    Unë kam kërkuar për këtë zgjidhje për një kohë të gjatë.
    Këtu lë komandën e plotë që kam përdorur

    Gjej. -emri "* .txt" -exec sed -i's | 192 \ .168 \ .0 \ .238 \ / Server | 192 \ .168 \ .0 \ .111 \ / të dhëna | g '{} \;

    Avantazhi i kësaj komande është se ajo ndryshon të gjitha skedarët .txt (ose shtesën që dëshironi) në mënyrë rekursive ... Duhet të jeni shumë të kujdesshëm!
    Por është shumë e dobishme !!!

    Epo, faleminderit për gjithçka dhe një mijë urime për të gjithë grupin.
    Gjithmonë i lexoj nga posta!
    Përqafime
    Seba