Späť na blog

Prehľad prúdového editora Sed na manipuláciu s textom v Linuxe

Prehľad prúdového editora Sed na manipuláciu s textom v Linuxe

Príkaz sed je skratka pre stream editor (prúdový editor). Je to veľmi populárny nástroj v systémoch Linux/UNIX. Sed sám o sebe nie je textový editor. Dokáže však vykonávať rôzne úpravy na manipuláciu s daným textom. Textový vstup sa posiela ako prúd (stream). Sed potom vykoná inštruované akcie na tomto prúde. Tento návod poskytuje prehľad o príkaze sed a o tom, ako ho používať na úspešnú manipuláciu s textom v Linuxe.

Sed v Linuxe

Vstupný prúd príkazu sed môže pochádzať buď z textového súboru, alebo zo STDIN (štandardný vstup). Môžeme pracovať s výstupom iného príkazu alebo pracovať priamo s textovým súborom. Nástroj sed je predinštalovaný vo všetkých distribúciách Linux.

Prehľad používania príkazu Sed

Príkaz sed má nasledujúcu štruktúru:

Na demonštračné účely sme si stiahli textovú verziu licencie GPL verzie 3:

Manipulate Text with Sed 7

Nasledujúci príkaz sed vytlačí obsah textového súboru:

Tu sed vykonáva operácie opísané v jednoduchých úvodzovkách a tlačí výstup. Keďže nie je definovaná žiadna možnosť, sed jednoducho vykoná prázdnu operáciu a vytlačí celý obsah súboru.

Sed prijíma aj výstup z iného príkazu ako vstupný prúd. V nasledujúcom príklade presmerujeme obsah textového súboru GPL v3 do príkazu sed na vykonanie prázdnej operácie:

Ako tlačiť riadky

Bez zadania akejkoľvek možnosti príkaz sed vytlačí celý obsah súboru priamo. Namiesto toho môžeme explicitne poslať príkaz na tlač, aby sa výsledky vytlačili priamo na štandardný výstup (STDOUT).

Na vytlačenie výstupu použite znak p:

Manipulate Text with Sed 6

V predvolenom nastavení sed tlačí výstup na obrazovku. Keďže sme špecificky použili príkaz na tlač, sed vytlačí každý riadok dvakrát. Sed pracuje riadok po riadku. Prečíta jeden riadok, vykoná špecifické operácie, vytlačí ho a prejde na ďalší riadok.

Ako vidíme, každý riadok sa vytlačí dvakrát. Ak je takýto výsledok mätúci, môžeme ho vyčistiť pomocou možnosti -n. Tá potláča funkciu automatickej tlače. Keďže posielame príkaz na tlač, nepotrebujeme mať povolenú predvolenú funkciu tlače výstupu:

Triedy znakov v regulárnych výrazoch

V regulárnych výrazoch existujú rôzne triedy znakov. Každá z týchto tried má svoj rozsah. Mnohé triedy majú tiež viacero výrazov. Väčšina tried sú rozsahy znakov:

    • [a-z]: Malé písmeno
    • [A-Z]: Veľké písmeno
    • [0-9]: Číslice
    • [a-zA-z]: Abeceda
    • [a-zA-z0-9]: Akýkoľvek alfanumerický znak

Tieto triedy znakov majú tiež rôzne zápisy:

    • [:lower:]: Malé písmeno
    • [:upper:]: Veľké písmeno
    • [:digit:]: Číslice
    • [:alpha:]: Abeceda
    • [:alphanum:]: Alfanumerický znak

Napríklad nasledujúci príkaz vytlačí všetky riadky, ktoré obsahujú aspoň jednu číslicu:

Manipulate Text with Sed 3

Rozsahy adries

Môžeme špecifikovať konkrétnu časť textového prúdu, s ktorou chceme pracovať. Môže to byť statické umiestnenie riadku alebo rozsah riadkov. V prvom príklade vytlačíme riadok 5 z textového súboru GPL v3:

$ sed -n

Namiesto jedného riadku môžeme špecifikovať aj rozsah riadkov, s ktorými chceme pracovať. Tu sme zadali rozsah adries od riadku 5 po riadok 9 (celkovo 5 riadkov), na ktorých bude sed pracovať:

gpl-3.0.txt

Existujú aj iné spôsoby špecifikovania adresy riadku. Namiesto toho, aby sme sami určovali čísla riadkov, môžeme predchádzajúci príklad upraviť tak, aby sed začal od riadku 5 a pracoval na nasledujúcich 5 riadkoch:

5,+5p

Ďalším spôsobom, ako špecifikovať riadky, je použitie intervalov. V nasledujúcom príklade začne sed od riadku 1 a bude pracovať na každom druhom riadku:

Mazanie textu

Doteraz sme pracovali na tlači cieľových riadkov textu. Namiesto tlače môžeme riadky z výstupu odstrániť. V nasledujúcom príklade odstránime viacero riadkov od začiatku. Tu nemusíme použiť voľbu -n pretože chceme, aby sed vytlačil všetko ostatné, čo nie je vymazané. Pre vymazanie riadku použijeme voľbu d:

Manipulate Text with Sed 2

Upozorňujeme, že zdrojový súbor je stále neporušený. Sed iba vykonáva vymazanie riadku počas výstupu. Ak chcete, môžete uložiť sed výstup do súboru. Môžete prepísať pôvodný súbor alebo ho uložiť ako iný:

Namiesto manuálneho zápisu výstupu do súboru môže sed vykonať úpravu priamo v pôvodnom súbore. Skrátene, sed upraví pôvodný súbor a zapíše všetky vykonané zmeny. Táto metóda prepíše pôvodný súbor, preto by sa mala používať opatrne:

Pretože úprava priamo v súbore je nebezpečná, sed prichádza s funkciou zálohovania. Pri vykonávaní úprav priamo v súbore použite -i.bak namiesto -i na vytvorenie zálohy pred úpravou. Sed vytvorí záložný súbor s .bak príponou:

Substitúcia textu

Toto je zďaleka jedna z najbežnejších implementácií sed. Vyhľadáva textový vzor a nahrádza ho zadaným textom. Tu je textový vzor opísaný regulárnymi výrazmi (skrátene regex). Ak sa chcete dozvedieť viac o používaní regexu, postupujte podľa tohto návodu, ktorý popisuje, ako použiť Grep s regexom na vyhľadávanie textových vzorov v súboroch.

Tu je príklad najzákladnejšieho nahradenia textu pomocou regexu:

Tu je s príkaz na nahradenie. Lomky sú oddeľovače pre vzor a nahradenie. Poďme to uviesť do praxe:

Manipulate Text with Sed 5

Nasledujúci príklad bude demonštrovať použitie podčiarkovníka (_). Tu budú podčiarkovníky fungovať ako oddeľovače:

Tu vyhľadávame com/index, aby sme to zmenili na net/home. Všimnite si umiestnenie podčiarkovníkov, pretože sú veľmi dôležité. Ak vám napríklad chýba posledný podčiarkovník, sed vyhodí chybu:

Na precvičenie nahradzovania potrebujeme nejaký testovací súbor. Tu mám orezanú verziu textového súboru GPL v3:

Poďme vykonať niekoľko základných nahradení textu:

Pozrite sa na nasledujúci príklad. Chceme zmeniť všetky výskyty the na THE :

$ echo

Všimli ste si niečo? Sed nezmenil všetky výskyty the. V skutočnosti zmenil iba prvý výskyt. Čo sa deje? Toto je predvolené správanie voľby s. Zhoduje sa iba s prvým výskytom na danom riadku a prejde na ďalší. Aby sme zabezpečili, že sed skontroluje celý riadok na hľadaný vzor, musíme použiť voliteľný príznak g. Poďme opraviť príkaz:

Teraz to funguje podľa predstáv. Ďalším zaujímavým spôsobom použitia príkazu je špecifikovanie počtu výskytov, ktoré sa majú zmeniť. V predchádzajúcom príklade boli 3 výskyty the, však? Čo keby sme určili, že sa má zmeniť iba 3. výskyt? Zmena nastane pri voliteľnom príznaku:

Ak pracujete s veľkým textovým súborom, môže pomôcť, ak sed vytlačí iba tie riadky, v ktorých došlo k nahradeniu. Aby sme to dosiahli, musíme pridať ďalší dodatočný príznak p:

Manipulate Text with Sed 4

Rozlišovanie veľkosti písmen

V predvolenom nastavení sú všetky sed operácie citlivé na veľkosť písmen. Nasledujúci príkaz demonštruje predvolené správanie rozlišovania veľkosti písmen:

$ echo "HELLO WORLD"

Kvôli nezhode veľkosti písmen nedôjde k žiadnej zmene. V takejto situácii môžeme príkazu sed povedať, aby ignoroval veľkosť písmen. Ak to chcete urobiť, pridajte voliteľný príznak i:

Ako nahrádzať texty a odkazovať na ne

Sila príkazu sed spočíva najmä v jeho schopnosti používať regulárne výrazy. S pokročilejšími a zložitejšími vzormi regulárnych výrazov dokážeme oveľa viac. Môžeme napríklad nahradiť text od začiatku súboru po určité miesto. Pozrite sa na nasledujúci výraz:

Tu text striešky (^) označuje začiatok riadku. Operátor pre akýkoľvek znak je označený bodkou (.). Hviezdička (*) je zástupný výraz, ktorý sa zhoduje od začiatku riadku až po GNU.

Ďalším zaujímavým trikom je použitie symbolu &. Môžeme ho použiť na zvýraznenie oblastí, v ktorých sednájde hľadaný vzor:

Manipulate Text with Sed

Záver

V tomto návode sme preskúmali základy príkazu sed . Naučili sme sa, ako tlačiť konkrétne riadky, vyhľadávať texty, mazať a nahrádzať texty, prepisovať texty a používať regulárne výrazy. Správne zostavený príkaz sed dokáže dramaticky zmeniť textový dokument. Teraz už môžete úspešne manipulovať s textom v Linuxe pomocou príkazu sed.

Príjemnú prácu s počítačom!

author

Hark Labs

Autor · CloudSigma

Preslav Dobrev je kreatívny dizajnér v spoločnosti CloudSigma, ktorý sa zameriava na konzistentnú firemnú identitu prostredníctvom tradičných a inovatívnych marketingových kanálov. Dokáže brilantne spájať umeleckú víziu so strategickým marketingom, čím vytvára pôsobivé príbehy značky.

Komentáre

Zatiaľ žiadne komentáre. Buďte prvý.