GNU/Linux >> Znalost Linux >  >> Linux

Unix Sed Výukový program:7 příkladů operací Sed Hold a Pattern Buffer

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

  1. Sed přečte řádek a umístí jej do vyrovnávací paměti vzorů.
  2. 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.
  3. 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

  1. První řádek bude umístěn do zadržovacího prostoru tak, jak je.
  2. 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í).
  3. Nyní se 1. a 2. řádek obrátily a přesuňte je do úložného prostoru.
  4. Opakujte výše uvedené kroky až do posledního řádku.
  5. 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

  1. Dokud se neobjeví prázdný řádek, přidávejte neprázdné řádky do zadržovacího prostoru
  2. 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

  1. Pro každý cyklus umístěte řádek do vyrovnávací paměti, pokud se neshoduje se vzorem „Mysql“.
  2. 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.
  3. 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

  1. 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.
  2. 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.
  3. 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

  1. Umístěte první řádek do vyrovnávací paměti Hold.
  2. Když přijde druhý řádek, připojte jej k Hold mezera (první řádek)
  3. 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.
  4. Zaměňte tedy řádky v prostoru vzorů.
  5. 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

  1. 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.
  2. U zbývajících řádků bloku připojí příkaz „G“ řádek tagu z Hold Space a nahradí řádky a řádky správně.

Linux
  1. Bash pro průvodce smyčkou a příklady

  2. Příklady Bash for Loop a While Loop

  3. Koncept 'Hold space' a 'Pattern space' v sed

  1. Linux ln Command Tutorial pro začátečníky (5 příkladů)

  2. Linux nl Command Tutorial pro začátečníky (7 příkladů)

  3. Linux nm Command Tutorial pro začátečníky (10 příkladů)

  1. Výukový program Linux OD Command pro začátečníky (6 příkladů)

  2. Linux which and whoami Command Tutorial pro začátečníky (s příklady)

  3. Linux w Command Tutorial pro začátečníky (5 příkladů)