logo

Sed Command v Linuxu/Unixu s příklady

Příkaz 'sed' pro Linux znamená editor streamu. Slouží k úpravě proudů (souborů) pomocí regulárních výrazů. Tato úprava ale není trvalá. Zůstává pouze na displeji, ale ve skutečnosti zůstává obsah souboru stejný.

Primárně se používá pro nahrazování textu; navíc jej lze použít pro další operace manipulace s textem, jako je vkládání, mazání, vyhledávání a další. Příkaz sed nám umožňuje upravovat soubory bez jejich otevírání. Podpora regulárních výrazů z něj činí výkonnější nástroj pro manipulaci s textem.

Přehled příkazu sed

Je to unixový nástroj, který transformuje a analyzuje text pomocí kompaktního a jednoduchého programovacího jazyka. Byl integrován v letech 1973 až 1974 Lee E. McMahonem z Bell Labs a dnes je přítomen téměř pro každý operační systém. Příkaz sed byl založen na skriptovacích aspektech dřívějšího qed (rychlý editor) a interaktivního editoru ed. Byl to nejstarší nástroj pro podporu regulárních výrazů a zůstává aktivní pro zpracování textu, především pomocí příkazu substituce. Mezi známé alternativní nástroje patří Perl a AWK for 'úprava streamu' a manipulace s prostým textem.

Operační režim velitelství sed

Příkaz sed je linkově orientovaný nástroj pro zpracování textu: řádek po řádku čte text ze souboru nebo vstupního proudu do vnitřní vyrovnávací paměti známé jako prostor vzorů. Všechna čtení řádků začínají cyklus. Příkaz sed používá jednu nebo více operací, které byly popsány skriptem sed do prostoru vzorů. Ovládá programovací jazyk pomocí asi 25 příkazů, které popisují operace nad textem.

Pro všechny vstupní řádky má příkaz sed obvykle za následek prostor vzoru a po provedení skriptu znovu spustí cyklus s dalším řádkem. Další vlastnosti konce skriptu jsou dostupné z příkazů skriptu a nastavení voleb, např. N pro okamžité zahrnutí dalšího řádku do prostoru vzoru, q pro ukončení, d pro odstranění prostoru vzoru atd. Skript sed se tedy vztahuje k tělu smyčky, která iteruje ze streamline, ve kterém jsou proměnná smyčky a samotná smyčka udržovány a implicitně sed.

  • Skript sed lze buď popsat na příkazovém řádku, nebo jej přečíst v izolovaném souboru. Ve skriptu sed mohou příkazy mít další adresu v kontextu regulárních výrazů nebo čísel řádků. O tom, kdy je příkaz vykonán, rozhoduje adresa. Například 2d provede pouze příkaz d (nebo delete) na 2. vstupním řádku, zatímco /^ /d odstraní každý řádek začínající mezerou.
  • Prostor hold, izolovaný speciální buffer, může být použit některými příkazy sed pro uchování hromadícího se textu mezi cykly. Příkazový jazyk sed má pouze dvě proměnné (pattern space a hold space) a funkci větvení jako GOTO. Jazyk je však Turingův úplný. Esoterické sed skripty jsou dostupné pro několik her, jako je tetris, šachy, arkanoid a sokoban.
  • Hlavní smyčka běží pro všechny řádky vstupního proudu a kontroluje sed skript na všech řádcích vstupu. Řádky skriptu sed jsou všechny dvojice vzor-akce, představující jaký vzor pro párování a kterou akci implementovat, což lze zkopírovat jako podmíněný příkaz. Výchozí akce (tiskový prostor vzoru, kopírování řádku do prostoru vzoru), vstupní a výstupní proudy a pracovní proměnné (prostor pro uložení a prostor vzoru) jsou implicitní; je možné specifikovat stručné jednořádkové programy kvůli hlavní smyčce.

Použití příkazu sed

    Substituční příkaz
    Níže uvedený příklad představuje nejvíce příkazů a typické použití příkazu sed, tj. substituce. Použití bylo skutečnou motivací pro příkaz sed:
    sed 's/regexp/replacement/g' inputFileName > outputFileNameDalší příkazy sed
    Pro jednoduché zpracování s nějakými 25 sed příkazy jsou možné i jiné způsoby. Například níže používá možnost d pro filtrování řádků, které obsahují pouze mezery a konec znaku řádku:
    sed '/^ *$/d' inputFileName
    Výše uvedený příklad používá několik níže uvedených metaznaků regulárního výrazu:
    • Stříška (^) je stejná jako začátek řádku.
    • Symbol dolaru ($) je stejný jako dokončení řádku.
    • Hvězdička (*) je stejná jako předchozí výskyt více nebo nulových znaků.
    • Symbol plus (+) je stejný jako jeden nebo více předchozích výskytů znaků.
    • Otazník (?) je stejný jako více nebo nulový výskyt předchozího znaku.
    • Symbol tečky (.) je přesně stejný jako jeden znak.
    sed jako filtr
    Příkaz sed se často používá jako filtr uvnitř potrubí pod Unixem:
    $generateData | sed 's/x/y/g'
    Program createData generuje data a příkaz sed provede malou změnu nahrazením x místo y.Souborové sed skripty
    Často je užitečné vložit mnoho příkazů sed, jeden příkaz na každý řádek, do souboru skriptu a použít příznak -f ke spuštění příkazů ze souboru:
    sed -f subst.sed název_vstupního_souboru > název_výstupního_souboru

Syntax:

 sed [OPTION]... {script-only-if-no-other-script} [input-file]... 

Možnosti:

Níže jsou uvedeny některé možnosti příkazového řádku příkazu sed:

-n, --tichý, --tichý: Silně nám umožňuje tisknout vzorový prostor.

-e skript, --expression=script: Používá se k přidání skriptu k příkazům, které mají být provedeny.

-f soubor-skriptu, --soubor=soubor-skriptu: Používá se k přidání obsahu souboru skriptu k příkazům, které mají být provedeny.

--follow-symlinks: používá se ke sledování symbolických odkazů při zpracování na místě.

-i[PŘÍPORA], --na místě[=PŘÍPOJKA]: používá se k úpravě souborů na místě (vytváří zálohu, pokud je poskytnuta možnost SUFFIX).

-l N, --line-length=N: Používá se k určení požadované délky zalamování řádku pro příkaz `l'.

--posix: používá se k deaktivaci všech rozšíření GNU.

-E, -r, --regexp-extended: Umožňuje nám používat rozšířené regulární výrazy ve skriptu (pro přenositelnost použijte POSIX -E).

-s, --separát: používá se k tomu, aby se soubory považovaly spíše za samostatné než za jeden a pokračuje v dlouhém proudu.

--pískoviště: Používá se pro provoz v režimu sandbox.

algoritmus pro rsa

-u, --unbuffered: Používá se pro načítání minimálního množství dat ze vstupních souborů a častěji vyprázdní výstupní buffery.

-z, --null-data: Používá se k oddělení řádků znaky NUL.

--Pomoc: slouží k zobrazení návodu k obsluze.

--verze: Slouží k zobrazení informací o verzi.

Příklady sed Command

Podívejme se na následující příklady:

Použití pro adresář STDIN

Příkaz sed není omezen pouze na manipulaci se soubory; také jej můžeme použít na adresář STDIN.

 echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/' 

Výše uvedené příkazy nahradí první text druhým textovým vzorem. Zvažte následující výstup:

spojový seznam
Linux Sed Filter

Z výše uvedeného výstupu jsme nejprve provedli příkaz 'sed' na řetězci 'class7', kde se 'class' změnilo na 'jtp' a 7 na 10. Poté jsme provedli příkaz 'sed' na streamu 'msg.txt ' kde 'učit se' je převedeno na 'studovat'.

Globální náhrada

V předchozím příkladu nebyla všechna slova „učit se“ upravena na „studovat“. Abychom mohli upravit každé slovo, musíme použít globální náhradu 'g'. Upraví všechna zadaná slova v souboru nebo řetězci.

Syntax:

 command | sed 's///g' 

Zvažte níže uvedené příklady:

 echo class7 class9 | sed 's/class/jtp/g' cat msg.txt | sed 's/learn/study/g' 

Výše uvedené příkazy nahradí všechny zadané textové vzory. Zvažte následující výstup:

Linux Sed Filter

Z výše uvedeného výstupu provedením příkazu 'echo class7 class9 | sed 's/class/jtp/g'' všechna 'třída' se převede na 'jtp' a příkazem 'cat msg.txt | sed 's/learn/study/g'' všechno 'učit se' bylo převedeno na 'studie'.

Odstranění čáry

Možnost 'd' nám umožní odstranit celý řádek ze souboru. Potřebujeme pouze zadat slovo z tohoto řádku pomocí možnosti 'd' a tento řádek bude odstraněn. Pamatujte však, že všechny řádky se stejným slovem budou odstraněny. Bude proveden jako:

 cat | sed '//d' 

Zvažte níže uvedený příkaz:

 cat msg.txt | sed '/jtp/d' 

Výše uvedený příkaz odstraní řádky obsahující slovo 'jtp'. Zvažte následující výstup:

Linux Sed Filter

Z výše uvedeného výstupu provedením příkazu 'cat msg.txt | sed '/jtp/d'' všechny řádky obsahující slovo 'jtp' jsou smazány.

Použití příkazu Multiple sed

Volba '-e' nám umožňuje provádět více příkazů sed najednou. Můžeme provést více než jednu operaci sed provedením příkazu jako:

 sed -e ' ; ' 

Zvažte níže uvedený příkaz:

 sed -e 's/red/blue/; s/yellow/black/' exm.txt 

Výše uvedený příkaz použije všechny operace uvedené v souboru 'exm.txt'. Zvažte následující výstup:

Linux Sed Filter

Jak můžeme vidět z výše uvedeného výstupu, všechna „červená“ slova jsou nahrazena „modrou“ a všechna „žlutá“ slova jsou nahrazena „černou“. Můžeme také oddělit příkazy takto:

 sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt 

Výsledek bude stejný jako výše uvedený příkaz.

Čtení příkazů ze souboru

Příkazy sed můžeme uložit do souboru a použít je najednou v libovolném souboru. To lze provést zadáním volby '-f' takto:

 sed -f 

Z výše uvedeného příkazu je '' soubor, který má seznam příkazů sed. Zvažte níže uvedený příkaz:

 sed -f SedCommands exm.txt 

Výše uvedený příkaz použije všechny zadané příkazy v souboru 'SedCommand' na 'exm.txt'. Zvažte následující výstup:

Linux Sed Filter

Z výše uvedeného výstupu jsme použili příkazy použité v předchozím příkladu. Výstup je tedy stejný jako v předchozím příkladu.

Nahrazování znaků

Jako oddělovač řetězce můžeme použít vykřičník (!). Například chceme nahradit bash shell a nahradit ho csh shellem v '/etc/passwd'. Chcete-li tak učinit, spusťte níže uvedený příkaz:

 sed 's//bin/bash//bin/csh/' /etc/passwd 

Stejného výsledku můžeme dosáhnout provedením níže uvedeného příkazu:

 sed 's!/bin/bash!/bin/csh!' /etc/passwd 

Omezení sed

Základní použití příkazu sed zpracuje celý soubor. Ale můžeme omezit příkaz sed a zadat libovolný řádek. Existují dva způsoby, jak omezit příkaz sed:

  • Řada linek.
  • Vzor, který odpovídá konkrétní linii.

Můžeme zadat číslo pro určení řádku takto:

 sed '3s/Red/Blue/' exm.txt 

Výše uvedený příkaz použije zadanou operaci na třetím řádku. Zvažte následující výstup:

Linux Sed Filter

Z výše uvedeného výstupu je upraven pouze řádek tři.

1nf 2nf 3nf

Můžeme také určit rozsah linek. Chcete-li zadat rozsah řádků, spusťte příkaz následovně:

 sed '1,3s/Red/Blue/' exm.txt 

Výše uvedený příkaz aktualizuje zadaný text v řádcích 1 a 3. Zvažte následující výstup:

Linux Sed Filter

Vkládání a přidávání textu

Příznak 'i' a 'a' se používá k vložení a připojení textu k souboru. Příznak 'i' přidá text před řetězec a příznak 'a' se používá k přidání textu za řetězec. Zvažte níže uvedený příkaz:

 echo 'Another Demo' | sed 'iFirst Demo' 

Výše uvedený příkaz vloží text před text 'Další ukázka'. Zvažte následující výstup:

Linux Sed Filter

Chcete-li připojit text, proveďte příkaz následovně:

 echo 'Another Demo' | sed 'aFirst Demo' 

Výše uvedený příkaz připojí text. Zvažte následující výstup:

Linux Sed Filter

Úprava čar

Příznak 'c' se používá k úpravě konkrétního řádku. Chcete-li upravit řádek, proveďte příkaz takto:

 sed '3cThis is a modified line.' exm.txt 

Výše uvedený příkaz aktualizuje řádek tři. Zvažte následující výstup:

Linux Sed Filter

Můžeme také použít regulární výraz k aktualizaci více než jednoho řádku se stejným vzorem. Zvažte níže uvedený příkaz:

 sed '/Apple is /c Line updated.' exm.txt 

Výše uvedený příkaz aktualizuje všechny řádky s řetězcem 'Apple is'. Zvažte následující výstup:

Linux Sed Filter

Transformace postav

Příznak 'y' se používá k transformaci znaků. Transformaci znaků nelze omezit na konkrétní výskyty. Chcete-li transformovat znaky, proveďte příkaz následovně:

 sed 'y/abc/def/' exm.txt 

Výše uvedený příkaz převede znaky 'a', 'b', 'c' na 'd', 'e', ​​'f'. zvažte následující výstup:

Linux Sed Filter

Tisk čísel řádků

Znak '=' se používá k vytištění čísla řádku. Chcete-li vytisknout číslo řádku, proveďte příkaz takto:

 sed '=' exm.txt 

Výše uvedený příkaz zobrazí číslo řádku obsahu souboru. Zvažte následující výstup:

Linux Sed Filter

Rovnítko s volbou '-n' určuje číslo řádku, který obsahuje odpovídající skript. Zvažte následující výstup:

 sed -n '/mango/=' exm.txt 

Výše uvedený příkaz zobrazí číslo řádku, který obsahuje slovo 'mango'. Zvažte následující výstup:

Linux Sed Filter

Z výše uvedeného výstupu vidíme, že řádek číslo 2 má slovo „mango“.