Úvod do editoru sed
Výraz sed je zkratka pro stream editor . Sed může převzít svůj vstup ze standardního vstupu, aplikovat požadované úpravy na stream a automaticky převést výsledky na standardní výstup. Syntaxe sed umožňuje zadat vstupní soubor na příkazovém řádku.
Když je spuštěný editor sed, nemusíte komunikovat; proto byl také označen jako dávkový editor. To je na rozdíl od editorů jako vi a ed, které jsou interaktivní. Protože sed nevyžaduje interakci, můžete příkazy sed umístit do skriptu. Můžete zavolat soubor skriptu a spustit jej proti datovému souboru, abyste mohli provádět opakované operace úprav.
Formát příkazu
Následující text ukazuje syntaxi příkazu sed:
# sed [options] 'action [args]' files [ > outfile]
Editor sed je schopen provádět substituce textových vzorů a mazání textových vzorů pomocí syntaxe regulárních výrazů. Jedná se o stejné znaky regulárního výrazu, které používá grep.
Příkaz sed nabízí možnosti, které jsou rozšířením interaktivní úpravy textu. Pokud potřebujete hledat a nahrazovat textové řetězce ve velkém počtu souborů, sed je nejužitečnější.
Úprava příkazů
Editor sed používá editační příkazy (uvedené v tabulce), které jsou podobné těm, které byste použili pro vi a ed.
Příkaz | Funkce |
---|---|
d | Smaže řádek(y) |
p | Vytiskne řádek(y) |
r | Čte soubor |
s | Nahrazuje jeden řetězec jiným |
w | Zapisuje do souboru |
Příkaz sed má dvě možnosti:
Možnost | Funkce |
---|---|
-n | Potlačí výchozí výstup |
-f | Čte příkazy sed ze souboru skriptu |
Ukázková data použitá v příkladech
Následující příklady provádějí příkazy sed proti souboru s názvem „data.txt“. Obsah souboru data.txt je následující.
# cat data.txt northwest NW Joel Craig 10 western WE Sharon Kelly 40 southwest SW Chris Foster 33 southern SO May Chin 45 southeast SE Derek Johnson 3 eastern EA Susan Beal 34 northeast NE TJ Nichols 67 north NO Val Shultz 91 central CT Sheri Watson 44
Použití sed k tisku textu
Příklad 1 :Rozsah tisku řádků
Následující příklad ukazuje použití příkazu p (print), který vytiskne rozsah řádků na stdout. Rozsah je určen počáteční adresou následovanou čárkou a poté koncovou adresou. Výchozí výstup sed je každý řádek, který přečte. Chcete-li potlačit výchozí výstup, použijte volbu -n.
# sed -n '3,5p' data.txt southwest SW Chris Foster 33 southern SO May Chin 45 southeast SE Derek Johnson 3
Příklad 2:Tisk řádků obsahujících konkrétní vzor
Následující příkaz vytiskne všechny řádky se vzorem západ. K oddělování regulárního výrazu použijte lomítko (/).
# sed -n '/west/p' data.txt northwest NW Joel Craig 10 western WE Sharon Kelly 40 southwest SW Chris Foster 33
Příklad 3:Tisk čáry s více vzory
Následující příkaz vytiskne první řádek obsahující vzor na západ až po další řádek obsahující vzor na jih včetně.
# sed -n '/west/,/southern/p' data.txt northwest NW Joel Craig 10 western WE Sharon Kelly 40 southwest SW Chris Foster 33 southern SO May Chin 45
Příklad 4 :Tisk čáry se vzorem a všech čar poté
Následující příkaz vytiskne první řádek obsahující vzor Chris až po poslední řádek souboru.
# sed -n '/Chris/,$p' data.txt southwest SW Chris Foster 33 southern SO May Chin 45 southeast SE Derek Johnson 3 eastern EA Susan Beal 34 northeast NE TJ Nichols 67 north NO Val Shultz 91 central CT Sheri Watson 44
Příklad 5 :Funkce podobná grep
Vzor může obsahovat znaky regulárního výrazu používané grep. Následující příklad vytiskne všechny řádky, které začínají sa a končí 5.
# sed -n '/^s.*5$/p' data.txt southern SO May Chin 45
Použití sed k nahrazení textu
Příkaz | Příklad | Akce úprav |
---|---|---|
s | sed s/x/y/option | Vyhledat a nahradit. Vyhledávací vzor x je nahrazen vzorem y. Vzor vyhledávání a nahrazování jsou ve většině případů regulární výrazy a chování vyhledávání a nahrazování lze ovlivnit různými možnostmi. |
y | sed y/abc/xyz/ | Nahraďte každý znak ze sady zdrojových znaků znakem, který má stejnou pozici v sadě cílových znaků. |
Příklad 1 :Vyhledejte a nahraďte konkrétní vzor
Sed s příkaz umožňuje provedení operace vyhledávání a nahrazování textu. Příkaz používá vyhledávání vzorů a doslovné nahrazení řetězce. Náhradní znaky řetězce jsou brány doslova bez rozšíření metaznaků.
# sed 's/3/X/' data.txt northwest NW Joel Craig 10 western WE Sharon Kelly 40 southwest SW Chris Foster X3 southern SO May Chin 45 southeast SE Derek Johnson X eastern EA Susan Beal X4 northeast NE TJ Nichols 67 north NO Val Shultz 91 central CT Sheri Watson 44
Příkaz sed zkontroluje každý řádek souboru a nahradí první výskyt starého řetězce novým řetězcem. Následné výskyty starého řetězce na stejném řádku zůstanou nezměněny.
Příklad 2 :Globálně vyhledejte a nahraďte konkrétní vzor
Následující příklad ukazuje g (globální) pomocí s (hledat a nahrazovat) a nahradí všechny výskyty starého řetězce novým řetězcem.
# sed 's/3/X/g' data.txt northwest NW Joel Craig 10 western WE Sharon Kelly 40 southwest SW Chris Foster XX southern SO May Chin 45 southeast SE Derek Johnson X eastern EA Susan Beal X4 northeast NE TJ Nichols 67 north NO Val Shultz 91 central CT Sheri Watson 44
Příklad 3 :Vyhledejte a nahraďte pomocí vyhledávacího vzoru zahrnutého v nahrazení
Občas při hledání a nahrazení bude starý řetězec součástí nového náhradního řetězce, čehož můžete dosáhnout umístěním &(ampersand) do náhradního řetězce. Umístění &určuje umístění starého řetězce v náhradním řetězci.
Cílem následujících příkladů je napsat příkaz, který vyhledá všechny řádky končící jednou číslicí v posledním poli a nahradí jednu číslici jednociferným číslem plus řetězcem Single Digit.
Chcete-li správně identifikovat řádky s jednocifernými čísly v posledním poli, zvažte následující příkaz sed. Tabulátory oddělují pole každým řádkem.
sed -n '/ [0-9]$/p' data.txt southeast SE Derek Johnson 3
Následující příkaz vyhledá všechny řádky, které končí jednou číslicí v posledním poli, a nahradí jednu číslici jednociferným číslem plus řetězcem Single Digit.
# sed 's/ [0-9]$/& Single Digit/' data.txt northwest NW Joel Craig 10 western WE Sharon Kelly 40 southwest SW Chris Foster 33 southern SO May Chin 45 southeast SE Derek Johnson 3 Single Digit eastern EA Susan Beal 34 northeast NE TJ Nichols 67 north NO Val Shultz 91 central CT Sheri Watson 44
Odstranění textu pomocí sed
Příklad 1:Odstranění řady řádků
Následující příkaz odstraní řádky 4 až 8 z výstupu.
# sed '4,8d' data.txt northwest NW Joel Craig 10 western WE Sharon Kelly 40 southwest SW Chris Foster 33 central CT Sheri Watson 44
Příklad 2 :Odstranění řádků obsahujících konkrétní vzor
Následující příkaz odstraní jakýkoli řádek obsahující vzor západ.
# sed '/west/d' data.txt southern SO May Chin 45 southeast SE Derek Johnson 3 eastern EA Susan Beal 34 northeast NE TJ Nichols 67 north NO Val Shultz 91 central CT Sheri Watson 44
Příklad 3
Následující příkaz odstraní jakýkoli řádek začínající vzorem západ.
# sed '/^west/d' data.txt northwest NW Joel Craig 10 southwest SW Chris Foster 33 southern SO May Chin 45 southeast SE Derek Johnson 3 eastern EA Susan Beal 34 northeast NE TJ Nichols 67 north NO Val Shultz 91 central CT Sheri Watson 44
Příklad 4
Následující příkaz odstraní rozsah řádků začínajících prvním řádkem obsahujícím vzor jih až po další řádek souboru obsahujícího sever.
# sed '/south/,/north/d' data.txt northwest NW Joel Craig 10 western WE Sharon Kelly 40 north NO Val Shultz 91 central CT Sheri Watson 44
Další funkce sed – úpravy příkazů
Další příkazy editoru sed jsou uvedeny v následující tabulce.
Příkaz | Funkce |
---|---|
a | Připojí text |
c | Změní text na aktuálním řádku novým textem |
i | Vloží text nad aktuální řádek |
Umístění více úprav do jednoho příkazu sed
Jsou chvíle, kdy chcete v souboru provést několik úprav. Místo použití více příkazů sed můžete použít volbu -e k umístění úprav do stejného příkazového řádku. Úpravy se provádějí v pořadí, které určíte.
Příklad 1
Pečlivě škrtejte řádky. Můžete provádět úpravy na řádku textu a následně tento řádek textu z výstupu odstranit. K tomu dochází v následujícím příkladu s řádkem 1 vstupního souboru.
# sed -e 's/north/North/' -e '1,4d' data.txt southeast SE Derek Johnson 3 eastern EA Susan Beal 34 Northeast NE TJ Nichols 67 North NO Val Shultz 91 central CT Sheri Watson 44