Jen málo unixových příkazů je tak slavných jako sed, grep a awk. Často se seskupují, možná proto, že mají podivná jména a výkonné nástroje pro analýzu textu. Sdílejí také některé syntaktické a logické podobnosti. A i když jsou všechny užitečné pro analýzu textu, každý má své speciality. Tento článek zkoumá sed
příkaz, což je editor streamu .
O sedovi jsem psal již dříve, stejně jako o jeho vzdáleném příbuzném ed. Chcete-li se se sedem dobře seznámit, pomůže vám mít určitou znalost ed, protože vám to pomůže zvyknout si na myšlenku vyrovnávacích pamětí. Tento článek předpokládá, že jste obeznámeni se samotnými základy sed, což znamená, že jste alespoň spustili klasický s/foo/bar/
style příkaz najít a nahradit.
[Stáhněte si náš bezplatný cheat sheet]
Instalace sed
Další zdroje pro Linux
- Cheat pro příkazy Linuxu
- Cheat sheet pro pokročilé příkazy systému Linux
- Bezplatný online kurz:Technický přehled RHEL
- Síťový cheat pro Linux
- Cheat sheet SELinux
- Cheat pro běžné příkazy pro Linux
- Co jsou kontejnery systému Linux?
- Naše nejnovější články o Linuxu
Pokud používáte Linux, BSD nebo macOS, máte již nainstalovaný GNU nebo BSD sed. Toto jsou jedinečné reimplementace původního sed
příkaz, a přestože jsou podobné, existují drobné rozdíly. Tento článek byl testován na verzích Linux a NetBSD, takže v tomto případě můžete použít jakýkoli sed, který najdete na svém počítači, i když pro sed BSD musíte použít krátké volby (-n
místo --quiet
, například) pouze.
GNU sed je obecně považován za nejbohatší dostupný sed, takže jej možná budete chtít vyzkoušet, ať už používáte Linux nebo ne. Pokud nemůžete najít GNU sed (často nazývaný gsed na nelinuxových systémech) ve stromu portů, můžete si stáhnout jeho zdrojový kód z webu GNU. Pěkná věc na instalaci GNU sed je, že můžete používat jeho další funkce, ale také jej omezit tak, aby odpovídal specifikacím POSIX sed, pokud požadujete přenositelnost.
Uživatelé MacOS mohou najít GNU sed na MacPorts nebo Homebrew.
V systému Windows můžete nainstalovat GNU sed s Chocolatey.
Porozumění prostoru vzoru a prostoru pro uložení
Sed pracuje vždy na jedné lince. Protože nemá žádné vizuální zobrazení, vytváří vzorový prostor , prostor v paměti obsahující aktuální řádek ze vstupního proudu (s odstraněnými koncovými znaky nového řádku). Jakmile naplníte prostor vzorů, sed provede vaše pokyny. Když se dostane na konec příkazů, vytiskne sed obsah prostoru vzorů do výstupního proudu. Výchozí výstupní proud je stdout , ale výstup může být přesměrován do souboru nebo dokonce zpět do stejného souboru pomocí --in-place=.bak
možnost.
Poté cyklus začíná znovu s dalším vstupním řádkem.
Pro zajištění trochu flexibility při procházení souborů pomocí sed poskytuje sed také záchytný prostor (někdy se také nazývá zadržovací vyrovnávací paměť ), prostor v paměti sed vyhrazený pro dočasné ukládání dat. Záchytný prostor si můžete představit jako schránku a ve skutečnosti je to přesně to, co tento článek ukazuje:jak kopírovat/vyjímat a vkládat pomocí sed.
Nejprve vytvořte ukázkový textový soubor s tímto textem jako obsahem:
Line one
Line three
Line two
Kopírování dat do prostoru pro uložení
Chcete-li něco umístit do úložného prostoru sed, použijte h
nebo H
příkaz. Malé h
říká sed, aby přepsal aktuální obsah zadržovacího prostoru, zatímco velké H
říká mu, aby připojil data ke všemu, co je již v úložném prostoru.
Pokud se používá samostatně, není toho moc vidět:
$ sed --quiet -e '/three/ h' example.txt
$
--quiet
(-n
zkráceně) volba potlačí veškerý výstup, ale to, co sed provedl pro mé požadavky na vyhledávání. V tomto případě sed vybere libovolný řádek obsahující řetězec three
a zkopírujte jej, aby zadržel místo. Neřekl jsem sed, aby něco vytiskl, takže se neprodukuje žádný výstup.
Kopírování dat z úložného prostoru
Chcete-li získat přehled o úložném prostoru, můžete zkopírovat jeho obsah z úložného prostoru a umístit jej do prostoru vzoru pomocí g
příkaz. Sledujte, co se stane:
$ sed -n -e '/three/h' -e 'g;p' example.txt
Line three
Line three
První prázdný řádek se vytiskne, protože úložný prostor je při prvním zkopírování do prostoru vzoru prázdný.
Další dva řádky obsahují Line three
protože to je to, co je v zadržovacím prostoru od řádku dva dále.
Tento příkaz používá dva jedinečné skripty (-e
) čistě pro pomoc s čitelností a organizací. Může být užitečné rozdělit kroky do jednotlivých skriptů, ale technicky tento příkaz funguje stejně dobře jako jeden příkaz skriptu:
$ sed -n -e '/three/h ; g ; p' example.txt
Line three
Line three
Připojování dat do prostoru vzorů
G
příkaz připojí znak nového řádku a obsah zadržovacího prostoru do prostoru vzoru.
$ sed -n -e '/three/h' -e 'G;p' example.txt
Line one
Line three
Line three
Line two
Line three
První dva řádky tohoto výstupu obsahují oba obsahy vzorového prostoru (Line one
) a prázdný úložný prostor. Následující dva řádky odpovídají hledanému textu (three
), takže obsahuje prostor vzoru i prostor pro uložení. U třetího páru řádků se zadržovací prostor nemění, takže prostor vzoru (Line two
) vytiskne s mezerou (stále Line three
). ) na konci.
Vyjmutí a vložení pomocí sed
Nyní, když víte, jak žonglovat s řetězcem ze vzoru, aby zadržel mezeru a zase zpět, můžete vymyslet sed skript, který zkopíruje, poté odstraní a poté vloží řádek do dokumentu. Příklad souboru pro tento článek má například Line three
mimo provoz. Sed to může opravit:
$ sed -n -e '/three/ h' -e '/three/ d' \
-e '/two/ G;p' example.txt
Line one
Line two
Line three
- První skript najde řádek obsahující řetězec
three
a zkopíruje jej z prostoru vzoru do úložného prostoru, čímž nahradí vše, co se aktuálně nachází v úložném prostoru. - Druhý skript odstraní jakýkoli řádek obsahující řetězec
three
. Tím je dokončen ekvivalent řezu akce v textovém editoru nebo textovém editoru. - Konečný skript najde řádek obsahující
two
a připojí obsah zadržovacího prostoru do prostoru vzoru a poté vytiskne prostor vzoru.
Práce hotová.
Skriptování pomocí sed
Opět platí, že použití samostatných příkazů skriptu je čistě pro vizuální a mentální jednoduchost. Příkaz vyjmout a vložit funguje jako jeden skript:
$ sed -n -e '/three/ h ; /three/ d ; /two/ G ; p' example.txt
Line one
Line two
Line three
Může být dokonce zapsán jako vyhrazený soubor skriptu:
#!/usr/bin/sed -nf
/three/h
/three/d
/two/ G
p
Chcete-li skript spustit, označte jej jako spustitelný a vyzkoušejte jej na vzorovém souboru:
$ chmod +x myscript.sed
$ ./myscript.sed example.txt
Line one
Line two
Line three
Samozřejmě, čím předvídatelnější text potřebujete analyzovat, tím snazší je vyřešit váš problém se sed. Obvykle není praktické vymýšlet „recepty“ pro akce sed (jako je kopírování a vkládání), protože podmínka pro spuštění akce se pravděpodobně soubor od souboru liší. Čím plynuleji však budete s příkazy sed, tím snazší je navrhnout složité akce na základě vstupu, který potřebujete analyzovat.
Důležité věci jsou rozpoznání odlišných akcí, pochopení, kdy se sed přesune na další řádek, a předpovídání toho, co lze očekávat, že vzor a prostor držení bude obsahovat.
Stáhněte si cheat sheet
Sed je komplexní. Má jen tucet příkazů, ale jeho flexibilní syntaxe a surový výkon znamenají, že je plný nekonečného potenciálu. Kdysi jsem odkazoval na stránky chytrých jednostránek ve snaze co nejvíce využít sed, ale až když jsem začal vymýšlet (a někdy znovu vymýšlet) svá vlastní řešení, měl jsem pocit, že začínám vlastně učit se sed. Pokud hledáte jemné připomenutí příkazů a užitečné tipy k syntaxi, stáhněte si náš cheat sheet sed a začněte se sed jednou provždy učit!