Sed je stream editor v operačním systému podobnému UNIXu, který se používá pro filtrování a transformaci textu. Sed je původně odvozen od základního editoru řádků ‚ed‘, editoru, který najdete na každém unixovém systému, ale který se používá jen zřídka kvůli jeho obtížnému uživatelskému rozhraní.
Jak sed funguje?
Protože sed je streamový editor, svou práci vykonává na proudu dat, který přijímá od stdin, například prostřednictvím roury, zapisuje své výsledky jako proud dat na stdout (často na ploše). Tento výstup můžeme přesměrovat do souboru . Sed obvykle neupravuje původní vstupní soubor; místo toho můžeme poslat obsah našeho souboru potrubím ke zpracování pomocí sed. To znamená, že nepotřebujeme mít na disku soubor s daty, která chcete změnit, což je zvláště užitečné, pokud máte data pocházející z jiného procesu a nikoli již zapsaná v souboru.
Syntaxe sed
# sed [option] commands [input-file]
V tomto příspěvku probereme některé praktické příklady příkazu sed, budeme provádět mnoho operací sed se souborem 'passwd', takže nejprve zkopírujte soubor '/etc/passwd' do složky /tmp.
# cp /etc/passwd /tmp/
Příklad 1:Odstranění všech řádků pomocí sed
# cat /tmp/passwd | sed 'd'
Příkaz výše odeslal celý obsah souboru /tmp/passwd potrubím do sed. Mějte na paměti, že soubor /tmp/passwd nebyl vůbec změněn. Sed pouze četl obsah souboru a my jsme mu neřekli, aby do souboru zapisoval, pouze z něj četl. Výsledky editačních příkazů na každém řádku vytištěny na standardní výstup. V tomto případě se na obrazovku nic nevytisklo, protože jsme použili možnost „d“ k odstranění každého řádku.
Příklad 2:Vyvolání sed s volbou „-e“ (přidání skriptu k příkazům, které se mají provést)
Namísto vyvolání sed odesláním souboru do něj prostřednictvím kanálu můžeme sed přikázat, aby četl data ze souboru, jak je znázorněno v příkladu níže.
# sed -e 'd' /tmp/passwd #
Vyvolání sed tímto způsobem explicitně definuje editační příkaz jako sed skript, který se má provést na vstupním souboru /tmp/passwd. Skript je zde jednoduše jednoznakový editační příkaz, ale mohl by být mnohem větší.
Můžeme také přesměrovat standardní výstup z příkazu sed do souboru.
# sed -e 'd' /tmp/passwd > /tmp/new-passwd
Příklad 3:Tisk řádků pomocí sed (-n flag &p příkaz)
Příznak ‚-n‘ zakáže automatický tisk, takže sed místo toho vytiskne řádky pouze tehdy, když je k tomu výslovně vyzván příkazem ‚p‘.
# cat /tmp/passwd | sed 'p' | head -5 root:x:0:0:root:/root:/bin/bash root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin
Jak vidíme výše, pokud zadáme editační příkaz ‚p‘ bez příznaku ‚-n‘, sed vytiskne duplicitní řádky. Chcete-li tedy zobrazit jedinečné řádky, použijte příznak „-n“ s příkazem p v sed. Příklady jsou uvedeny níže:
# cat /tmp/passwd | sed -n 'p' | head -5 root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync
Příklad 4:Úprava zdrojového souboru pomocí volby „-i“
Příkaz Sed ve výchozím nastavení neupravuje původní nebo zdrojový soubor z důvodu naší bezpečnosti, ale pomocí volby „-i“ lze zdrojový soubor upravit.
# sed -i '1d' /tmp/passwd
Výše uvedený příkaz smaže první řádek zdrojového souboru /tmp/passwd.
Příklad 5:Proveďte zálohu zdrojového souboru před úpravou
Když použijeme volbu „-i“ v příkazu sed, stane se to velmi riskantní, protože bude přímo upravovat zdrojový soubor, takže je lepší si před úpravou zdrojového souboru zálohovat, příklad je uveden níže.
# sed -i.bak '1d' /tmp/passwd
# ls -l /tmp/passwd* -rw-r--r-- 1 root root 2229 Nov 24 22:36 /tmp/passwd -rw-r--r-- 1 root root 2261 Nov 24 22:35 /tmp/passwd.bak
Ve výše uvedeném příkazu sed bude odstraněn 1. řádek souboru /tmp/passwd, ale předtím příkaz sed provede zálohu /tmp/passwd jako /tmp/passwd.bak.
Příklad 6:Odstranění řádků zadáním rozsahu.
Smazání prvních 5 řádků souboru /tmp/passwd.
# cat /tmp/passwd | sed '1,5d'
Příklad 7:Smazání prázdných řádků souboru
# cat /tmp/detail.txt 245 678 linux unix suse
V souboru details.txt máme dva prázdné řádky, pro smazání prázdných řádků použijte příkaz níže.
# sed '/^$/d' /tmp/detail.txt 245 678 linux unix suse
Příklad 8:Vymazání řádků obsahujících řetězce
Předpokládejme, že chceme odstranit řádek ze souboru /tmp/passwd, který obsahuje slovo „hry“.
# sed '/games/d' /tmp/passwd
Příklad 9:Hledat a nahradit řetězce v souboru
Předpokládejme, že chcete nahradit „root“ za „Admin“, příklad je uveden níže:
# sed 's/root/Admin/' /tmp/passwd
Je velmi důležité poznamenat, že sed nahradí pouze první výskyt na řádku. Pokud se řetězec „kořen“ vyskytuje na řádku více než jednou, bude nahrazena pouze první shoda. Chcete-li nahradit každý řetězec v souboru novým, nikoli pouze prvním výskytem, chcete-li provést substituci globálně, přidejte na konec příkazu písmeno „g“, jak je znázorněno níže:
# sed 's/root/Admin/g' /tmp/passwd
Příklad 10:Vícenásobná substituce pomocí volby -e
Předpokládejme, že chceme nahradit řetězec „root“ řetězcem „Admin“ a řetězec „bash“ řetězcem „sh“. Příklad je uveden níže:
# cat /tmp/passwd | sed -e 's/root/Admin/g' -e 's/bash/sh/g'