Zpět na blog

Přehled proudového editoru sed pro manipulaci s textem v Linuxu

Přehled proudového editoru sed pro manipulaci s textem v Linuxu

Příkaz sed je zkratka pro stream editor (proudový editor). Je to velmi populární nástroj v systémech Linux/UNIX. Sed sám o sobě není textový editor. Dokáže však provádět různé úpravy pro manipulaci se zadaným textem. Textový vstup je odesílán jako proud. Sed poté provede na tomto proudu instrukce. Tato příručka poskytuje přehled o příkazu sed a o tom, jak s ním pracovat, abyste mohli úspěšně manipulovat s textem v Linuxu.

Sed v Linuxu

Vstupní proud příkazu sed může pocházet buď z textového souboru, nebo ze STDIN (standardního vstupu). Můžeme pracovat s výstupem jiného příkazu nebo přímo s textovým souborem. Nástroj sed je předinstalován ve všech Linux distribucích.

Přehled použití příkazu Sed

Příkaz sed má následující strukturu:

Pro demonstrační účely jsme stáhli textovou verzi licence GPL verze 3:

Manipulate Text with Sed 7

Následující příkaz sed vytiskne obsah textového souboru:

V tomto případě sed provádí operace popsané v jednoduchých uvozovkách a tiskne výstup. Vzhledem k tomu, že není definována žádná volba, sed jednoduše provede prázdnou operaci a vytiskne celý obsah souboru.

Sed také přijímá výstup z jiného příkazu jako vstupní proud. V následujícím příkladu přesměrujte obsah textového souboru GPL v3 do příkazu sed pro provedení prázdné operace:

Jak tisknout řádky

Bez zadání jakékoli volby vytiskne sed veškerý obsah souboru přímo. Místo toho můžeme explicitně odeslat příkaz k tisku, který vytiskne výsledky přímo na standardní výstup (STDOUT).

Chcete-li výstup vytisknout, použijte znak p:

Manipulate Text with Sed 6

Ve výchozím nastavení tiskne sed výstup na obrazovku. Protože jsme konkrétně použili příkaz pro tisk, sed vytiskne každý řádek dvakrát. Sed pracuje řádek po řádku. Přečte jeden řádek, provede konkrétní operace, vytiskne jej a přejde na další řádek.

Jak vidíme, každý řádek je vytištěn dvakrát. Pokud je výsledek takto matoucí, můžeme jej vyčistit pomocí volby -n. Ta potlačuje funkci automatického tisku. Protože posíláme příkaz k tisku, nepotřebujeme mít povolenou výchozí funkci tisku výstupu:

Třídy znaků v regulárních výrazech

V regulárních výrazech existují různé třídy znaků. Každá z těchto tříd má svůj rozsah. Mnoho tříd má také více výrazů. Většina tříd jsou rozsahy znaků:

    • [a-z]: Malé písmeno
    • [A-Z]: Velké písmeno
    • [0-9]: Číslice
    • [a-zA-z]: Abeceda
    • [a-zA-z0-9]: Jakýkoli alfanumerický znak

Tyto třídy znaků mají také různé zápisy:

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

Například následující příkaz vytiskne všechny řádky, které obsahují alespoň jednu číslici:

Manipulate Text with Sed 3

Rozsahy adres

Můžeme určit konkrétní část textového proudu, se kterou chceme pracovat. Může to být statické umístění řádku nebo rozsah řádků. V prvním příkladu vytiskneme řádek 5 z textového souboru GPL v3:

$ sed -n

Místo jednoho řádku můžeme také určit rozsah řádků, se kterými se má pracovat. Zde jsme zadali rozsah adres od řádku 5 do řádku 9 (celkem 5 řádků), na kterých bude sed pracovat:

gpl-3.0.txt

Existují také různé způsoby zadání adresy řádku. Místo toho, abychom sami určovali čísla řádků, můžeme předchozí příklad upravit tak, aby sed začal od řádku 5 a pracoval na následujících 5 řádcích:

5,+5p

Dalším způsobem, jak určit řádky, je použití intervalů. V následujícím příkladu sed začne od řádku 1 a bude pracovat na každém druhém řádku:

Mazání textu

Dosud jsme pracovali na tisku cílových řádků textu. Místo tisku můžeme řádky z výstupu odstranit. V následujícím příkladu odstraníme několik řádků od začátku. Zde nemusíme použít volbu -n protože chceme, aby sed vytiskl vše ostatní, co není smazáno. Pro mazání řádků použijeme volbu d:

Manipulate Text with Sed 2

Všimněte si, že zdrojový soubor je stále nedotčen. Sed pouze provádí mazání řádků během výstupu. Pokud chcete, můžete uložit výstup sed do souboru. Můžete přepsat původní soubor nebo jej uložit jako jiný:

Místo ručního zápisu výstupu do souboru může sed provést úpravu přímo v původním souboru. Stručně řečeno, sed upraví původní soubor a zapíše všechny provedené změny. Tato metoda přepíše původní soubor, proto by se měla používat opatrně:

Protože úprava přímo v souboru je nebezpečná, sed přichází s funkcí zálohování. Při provádění úprav přímo v souboru použijte -i.bak namísto -i k vytvoření zálohy před úpravou. Sed vytvoří záložní soubor s příponou .bak:

Nahrazování textu

Toto je zdaleka jedna z nejčastějších implementací nástroje sed. Vyhledává textový vzor a nahrazuje jej zadaným textem. Zde je textový vzor popsán regulárními výrazy (zkráceně regex). Chcete-li se dozvědět více o používání regulárních výrazů, postupujte podle tohoto návodu, který popisuje, jak použít Grep s regulárními výrazy k vyhledávání textových vzorů v souborech.

Zde je příklad nejzákladnějšího nahrazení textu pomocí regulárních výrazů:

Zde je s příkaz pro nahrazení. Lomítka jsou oddělovače pro vzor a náhradu. Pojďme to uvést do praxe:

Manipulate Text with Sed 5

Následující příklad bude demonstrovat použití podtržítka (_). Zde budou podtržítka fungovat jako oddělovače:

Zde hledáme com/index, abychom to změnili na net/home. Všimněte si umístění podtržítek, protože jsou velmi důležitá. Pokud například vynecháte poslední podtržítko, sed vyhodí chybu:

K procvičení nahrazování potřebujeme nějaký testovací soubor. Zde mám oříznutou verzi textového souboru GPL v3:

Provedeme několik základních nahrazení textu:

Podívejte se na další příklad. Chceme změnit všechny výskyty the na THE :

$ echo

Všimli jste si něčeho? Sed nezměnil všechny výskyty the. Ve skutečnosti pouze první výskyt. Co se děje? Toto je výchozí chování volby s. Odpovídá pouze prvnímu výskytu na daném řádku a přechází na další. Abychom zajistili, že sed zkontroluje celý řádek na hledaný vzor, musíme použít volitelný příznak g. Pojďme příkaz opravit:

Nyní to funguje podle představ. Dalším zajímavým způsobem použití příkazu je určení počtu výskytů, které se mají změnit. V předchozím příkladu byly 3 výskyty the, že? Co kdybychom určili, že se má změnit pouze 3. výskyt? Změna se projeví u volitelného příznaku:

Pokud pracujete s velkým textovým souborem, může pomoci, když sed vytiskne pouze ty řádky, ve kterých došlo k nahrazení. Chceme-li toho dosáhnout, musíme přidat další dodatečný příznak p:

Manipulate Text with Sed 4

Citlivost na velikost písmen

Ve výchozím nastavení jsou všechny sed operace citlivé na velikost písmen. Následující příkaz demonstruje výchozí chování citlivosti na velikost písmen:

$ echo "HELLO WORLD"

Kvůli neshodě ve velikosti písmen nedojde k žádné změně. V takové situaci můžeme příkazu sed říct, aby citlivost na velikost písmen ignoroval. Chcete-li tak učinit, přidejte volitelný příznak i:

Jak nahrazovat a odkazovat na texty

Síla nástroje sed spočívá především v jeho schopnosti používat regulární výrazy. S pokročilejšími a složitějšími regulárními výrazy toho dokážeme mnohem více. Můžeme například nahradit text od začátku souboru až po určité místo. Podívejte se na následující výraz:

Zde znak stříšky (^) označuje začátek řádku. Operátor pro shodu s jakýmkoli znakem je vyjádřen tečkou (.). Hvězdička (*) je zástupný výraz, který odpovídá textu od začátku řádku až po GNU.

Dalším zajímavým trikem je použití symbolu &. Můžeme jej použít ke zvýraznění oblastí, které sed najde jako vyhledávaný vzor:

Manipulate Text with Sed

Závěrečné shrnutí

V tomto návodu jsme prozkoumali základy příkazu sed . Naučili jsme se tisknout konkrétní řádky, vyhledávat texty, mazat a nahrazovat texty, přepisovat texty a používat regulární výrazy. Správně sestavený příkaz sed dokáže dramaticky změnit textový dokument. Nyní můžete úspěšně manipulovat s textem v Linuxu pomocí nástroje sed.

Příjemnou práci s počítačem!

author

Hark Labs

Autor · CloudSigma

Preslav Dobrev je kreativní designér ve společnosti CloudSigma, který se zaměřuje na konzistentní firemní identitu prostřednictvím tradičních i inovativních marketingových kanálů. Je zdatný v propojování umělecké vize se strategickým marketingem za účelem vytváření působivých příběhů značky.

Komentáře

Zatím žádné komentáře. Buďte první.