Tento článek je součástí probíhající série Unix Sed Tips and Tricks.
V našich předchozích článcích o sed jsme se naučili – tisk sed, mazání sed, náhrada sed, zápis souboru sed, více příkazů sed, víceřádkové operace sed a manipulace s řádky souboru sed.
V naší první části sed tutoriálu jsme se dozvěděli, že sed má dva buffery — sed pattern buffer a sed hold buffer . Dosud jsme mluvili pouze o vyrovnávací paměti vzorů.
V tomto článku si ukážeme, jak používat sed hold a pattern buffer pomocí 7 praktických příkladů sed .
Jak název napovídá, sed hold buffer se používá k uložení celého prostoru vzorů sed nebo jeho části pro následné vyzvednutí. Obsah prostoru vzorů lze zkopírovat do úložného prostoru a poté zpět. Žádné operace nejsou prováděny přímo na úložném prostoru. sed poskytuje sadu funkcí hold a get pro zvládnutí těchto pohybů.
Funkce Sed h
Funkce h (hold) zkopíruje obsah prostoru vzoru do oblasti uchování (nazývané také sed hold space ), zničí veškerý předchozí obsah zadržovacího prostoru.
Funkce Sed H
Funkce H připojí obsah prostoru vzoru k obsahu ukládací oblasti. Původní a nový obsah jsou odděleny novým řádkem.
Funkce Sed g
Funkce g zkopíruje obsah ukládací oblasti do prostoru vzoru, čímž zničí předchozí obsah prostoru vzoru.
Funkce Sed G
Funkce G připojí obsah oblasti uložení k obsahu prostoru vzoru. Původní a nový obsah jsou odděleny novým řádkem. Maximální počet adres jsou dvě.
Funkce Sed x
Funkce výměny vyměňuje obsah prostoru vzoru a oblasti uložení. Maximální počet adres jsou dvě.
Nyní se podívejme na několik příkladů, abychom se dozvěděli o výše uvedených příkazech.
Nejprve vytvořte soubor geekstuff.txt, který bude použit v příkladech uvedených níže.
$ cat thegeekstuff.txt #Linux Administration Scripting Tips and Tricks #Windows Administration #Database Mysql Oracle Queries Procedures
1. Dvojitá mezera v obsahu souboru pomocí příkazu Sed
$sed 'G' thegeekstuff.txt #Linux Administration Scripting Tips and Tricks #Windows Administration #Database Mysql Oracle Queries Procedures $
V tomto příkladu
- Sed přečte řádek a umístí jej do vyrovnávací paměti vzorů.
- Příkaz G připojí zadržovací vyrovnávací paměť k vyrovnávací paměti vzorů oddělené \n. takže bude připojen jeden nový řádek s obsahem vzorového prostoru.
- Podobně platí, že pokud chcete ztrojnásobit prostor v souboru, připojte obsah vyrovnávací paměti pro uložení do vyrovnávací paměti se vzorem dvakrát. (G;G)
2. Tisk obsahu souboru v opačném pořadí pomocí příkazu Sed
Vytiskněte řádky souboru v opačném pořadí (podobně jako příkaz tac, o kterém jsme hovořili dříve).
$sed -n '1!G;h;$p' thegeekstuff.txt Procedures Queries Oracle Mysql #Database Administration #Windows Tips and Tricks Scripting Administration #Linux
V tomto příkladu
- První řádek bude umístěn do zadržovacího prostoru tak, jak je.
- Od 2. řádku pouze připojte obsah zadržovacího prostoru k prostoru vzoru. (Pamatujte si, že 2. řádek je v prostoru vzoru a 1. řádek je v prostoru pro pozastavení).
- Nyní se 1. a 2. řádek obrátily a přesuňte je do úložného prostoru.
- Opakujte výše uvedené kroky až do posledního řádku.
- Jakmile dosáhnete posledního řádku, stačí připojit obsah zadržovacího prostoru s prostorem vzoru a prostor vzoru vytisknout.
3. Vytiskněte odstavec (pouze pokud obsahuje daný vzor) pomocí příkazu Sed
V souboru geekstuff.txt vytiskněte odstavec pouze v případě, že obsahuje vzor „Administrace“.
$ sed -e '/./{H;$!d;}' -e 'x;/Administration/!d' thegeekstuff.txt Linux Administration Scripting Tips and Tricks Windows Administration
V tomto příkladu
- Dokud se neobjeví prázdný řádek, přidávejte neprázdné řádky do zadržovacího prostoru
- Když přijde prázdný řádek, tj. konec odstavce, vyměňte data mezi vzorem a mezerou. Takže celý odstavec bude k dispozici ve vzorovém prostoru.
Zkontrolujte, zda je k dispozici vzor „Správa“, pokud ano, neodstraňujte jej, tj. vytiskněte prostor vzoru
4. Vytiskněte řádek bezprostředně před shodou vzoru pomocí příkazu Sed
Vytiskněte pouze řádek bezprostředně před, vzor „Mysql“.
$ sed -n '/Mysql/{g;1!p;};h' thegeekstuff.txt #Database
V tomto příkladu
- Pro každý cyklus umístěte řádek do vyrovnávací paměti, pokud se neshoduje se vzorem „Mysql“.
- Pokud se čára shoduje se vzorem, získejte data z prostoru pro uložení (předchozí řádek) pomocí příkazu g a vytiskněte je.
- V případě, že se první řádek shoduje se vzorem „Mysql“, bude i tak prázdné místo. (Na prvním řádku není žádný předchozí řádek). První řádek by se tedy neměl vytisknout (1!p)
5. Odstraňte poslední řádek každého odstavce pomocí příkazu Sed
$ sed -n -e '/^$/{x;d}' -e '/./x;p' thegeekstuff.txt #Linux Administration Scripting #Windows #Database Mysql Oracle Queries
V tomto příkladu
- Pokud řádek není prázdný, vyměňte řádek mezi vzorem a mezerou. Takže první řádek bude umístěn do úložného prostoru.
- Až přijde další neprázdný řádek, vyměňte prostor se vzorem a prostor se vzorem a vytiskněte prostor se vzorem. tj. první neprázdný řádek bude vytištěn a druhý řádek zůstane zachován. A v dalším cyklu se vytiskne 2. neprázdný řádek, když se 3. řádek podrží a pokračuje takto.
- Když přijde prázdný řádek (předchozí řádek k prázdnému řádku bude k dispozici ve vyrovnávací paměti pro pozastavení), jednoduše vyměňte vzor a podržte mezeru a smažte řádek (poslední řádek odstavce) a začněte další cyklus.
6. Pro každý řádek připojte předchozí řádek na jeho konec pomocí příkazu Sed
$ sed 'H;x;s/^\(.*\)\n\(.*\)/\2\1/' thegeekstuff.txt #Linux Administration#Linux Scripting Administration Tips and Tricks Scripting Tips and Tricks #Windows Administration#Windows Administration #Database Mysql#Database Oracle Mysql Queries Oracle Procedures Queries
V tomto příkladu
- Umístěte první řádek do vyrovnávací paměti Hold.
- Když přijde druhý řádek, připojte jej k Hold mezera (první řádek)
- Potom vyměňte vzor a podržte vyrovnávací paměť. Takže nyní bude mít prostor vzoru první a druhý řádek oddělené \n, mezera Hold bude mít pouze druhý řádek.
- Zaměňte tedy řádky v prostoru vzorů.
- Výše uvedené kroky probíhají až do konce souboru
7. Před každý řádek tohoto bloku přidejte tag každého bloku
$ sed ' /^#/{ h d } G s/^\(.*\)\n#\(.*\)/\2 \1/' thegeekstuff.txt Linux Administration Linux Scripting Linux Tips and Tricks Linux Windows Administration Windows Database Mysql Database Oracle Database Queries Database Procedures
V tomto příkladu
- Když je splněn první řádek bloku (začínající znakem #)
- ponechte tento řádek na Hold Space pomocí příkazu „h“
- Poté smažte pomocí „d“ a začněte další cyklus.
- U zbývajících řádků bloku připojí příkaz „G“ řádek tagu z Hold Space a nahradí řádky a řádky správně.