7. cvičení
Zpracování textu: proudový editor sed
Základní použití
sed [-n] [-e] 'příkazy' soubory
sed [-n] -f script soubory
Výpis textu
// Vytiskne obsah souboru (každý řádek 2x)
sed 'p' text.txt
// Vytiskne obsah souboru
sed -n 'p' text.txt
// Vytiskne první řádek
sed -n '1p' text.txt
// Vytiskne 1. až 5. řádek
sed -n '1,5p' text.txt
// Vytiskne první řádek následovaný dalšími 4.
sed -n '1,+4p' text.txt
// Vypíše každý druhý řádek
sed -n '1~2p' text.txt
Mazání textu
// Smazání každého druhého řádku
sed '1~2d' text.txt
// Uložení výsledku do souboru
sed '1~2d' text.txt > output.txt
// Modifikace původního souboru
sed -i '1~2d' output.txt
// Vytvoření zálohy souboru před modifikací
sed -i.bak '1~2d' output.txt
Nahrazení textu
// Syntaxe 's/old_word/new_word/'
// Testovací soubor
echo "this is the song that never ends
yes, it goes on and on, my friend
some people started singing it
not knowing what it was
and they'll continue singing it forever
just because..." > annoying.txt
echo "http://www.example.com/index.html" | sed 's_com/index_org/home_'
// Tento příkaz nahradí pouze první výskyt slova "on" slovem "forward"
sed 's/on/forward/' annoying.txt
// Přidáním parametru g řekneme že chceme nahradit každý výskyt na řádku
sed 's/on/forward/g' annoying.txt
// Můžeme také nahradit pouze druhý výskyt na řádku
sed 's/on/forward/2' annoying.txt
// Pokud chceme vytisknout pouze řádky kde nastala změna
sed -n 's/on/forward/2p' annoying.text
// Pomocí parametru i ignotujeme malá a velká písmena
sed 's/SINGING/saying/i' annoying.txt
Pokročileší vyhledávání textu
// Nahradí text začínájící libovolným znakem následovaný libovolným řetězcem a končímím znaky at slovem REPLACED
sed 's/^.*at/REPLACED/' annoying.txt
// Uzavorkování textu který odpovídá regulárnímu výrazu
sed 's/^.*at/(&)/' annoying.txt
// Prohození prvních dvou slov na každém řádku
sed 's/\([^ ][^ ]*\) \([^ ][^ ]*\)/\2 \1/' annoying.txt
Úkoly
-
Vytvořte sed skript, který prohodí v tabulkovém textu (sloupce oddělené tabulátorem) první a druhý sloupec.
1 bod
-
Uvažujme text, ve kterém některé řádky představují nadpisy uvozené číslováním 1., 1.1, 1.1.1 atd. Vytvořte sed skript, který z textu vypíše pouze tyto nadpisy, bez číslování, ve stromové struktuře - odsazením levého okraje podnadpisů od levého okraje nadřazeného nadpisu mezerou.
1 bod
-
Vytvořte sed skript, který sloučí sousední řádky textu končící znakem -, pokud před ním nejsou mezery, spolu s následujícím řádkem (bez znaku - na konci) do jednoho řádku, s odstraněním znaků -.
1 bod
-
Vytvořte sed skript, který z textu vypíše jen řádky od řádku 10 do řádku 20 včetně v opačném pořadí řádků.
1 bod