V rámci naší série výukových programů UNIX sed jsme se dříve zabývali tiskem, mazáním, nahrazováním, zápisem souborů, příkazy pro manipulaci se soubory atd., s jedním řádkem v prostoru vzoru.
V tomto článku se podíváme na to, jak provést víceřádkovou operaci v Sed.
Pamatujete si pracovní metodologii Sed, kterou jsme se naučili v našem prvním tutoriálu pro sed?. V tomto článku jsme vysvětlili, že Sed čte řádek po řádku, odstraňuje všechny nové koncové řádky, umísťuje řádek do vyrovnávací paměti prostoru vzorů, zpracovává podle daných příkazů a tiskne prostor vzoru.
V případě, že chcete odstranit všechny nové řádky v souboru, nemůžete použít následující metodu. Protože nový řádek je již odstraněn a umístěn do prostoru vzoru.
$ sed 's/\n//' filename or $sed 's/\n/ENDOFLINE\n/' filename
Pro situace, jako je tato, je vhodný sed víceřadý. Sed poskytuje příkaz „N“ pro víceřádkové operace.
Příkaz N přečte další řádek ze vstupu, Přidat další řádek do prostoru vzoru. Další řádek je oddělen od prostoru původního vzoru znakem nového řádku.
Nejprve vytvořte soubor geekstuff.txt, který bude použit ve všech níže uvedených příkladech.
$ cat thegeekstuff.txt Linux Sysadmin Databases - Oracle, mySQL etc. Databases - Oracle, mySQL etc. Security (Firewall, Network, Online Security etc) Storage in Linux Website Design Website Design Windows- Sysadmin, reboot etc. $
Poznámka: Ve výše uvedeném vstupu jsou dva po sobě jdoucí prázdné řádky. ( 5. a 6. řádek ).
Příklad sed 1. Spojte dva po sobě jdoucí řádky
$ sed -e '{ N s/\n/ @ / }' thegeekstuff.txt Linux Sysadmin @ Databases - Oracle, mySQL etc. Databases - Oracle, mySQL etc. @ Security (Firewall, Network, Online Security etc) @ Storage in Linux @ Website Design Website Design @ Windows- Sysadmin, reboot etc.
Ve výše uvedeném příkladu
- Složené závorky „{“ a „}“ používané k seskupování příkazů. Složené závorky a příkazy sed musí být na samostatných řádcích.
- Sed přečte první řádek a umístí jej do prostoru vzoru, příkaz N přečte další řádek a připojí prostor vzoru, tj. první řádek oddělený novým řádkem. Prostor vzorů tedy nyní bude mít první řádek\ndruhý řádek.
- Další náhrada \n za space@space a vytiskne obsah vzorového prostoru jako své výchozí chování. Po sobě jdoucí řádky jsou tedy spojeny a odděleny znakem „ @ “
Příklad Sed 2. Očíslujte každý neprázdný řádek souboru
Jak bylo zmíněno v našem předchozím článku, =je příkaz pro získání čísla řádku souboru.
$ sed '/./=' thegeekstuff.txt | sed 'N; s/\n/ /' 1 Linux Sysadmin 2 Databases - Oracle, mySQL etc. 3 Databases - Oracle, mySQL etc. 4 Security (Firewall, Network, Online Security etc) 7 Storage in Linux 8 Website Design 9 Website Design 10 Windows- Sysadmin, reboot etc.
- První příkaz sed vytiskne číslo řádku a vytiskne původní řádek na další řádek, pokud není prázdný. (Spusťte jej a podívejte se na výstup prvního příkazu sed).
- Další příkaz sed pouze připojí pár řádků.
Příklad sed 3. Odstranění dvou po sobě jdoucích prázdných řádků ze vstupu
$ sed '/^$/{ N /^\n$/d }' thegeekstuff.txt Linux Sysadmin Databases - Oracle, mySQL etc. Databases - Oracle, mySQL etc. Security (Firewall, Network, Online Security etc) Storage in Linux Website Design Website Design Windows- Sysadmin, reboot etc.
Pokud je řádek prázdný, přečte a připojí další řádek, /^\n$/ představuje, dva řádky jsou prázdné,\n se přidá příkazem N. Pak stačí odstranit prostor vzoru a spustit další cyklus pomocí příkazu ‚d‘.
Sed Příklad 4. Smazat poslední 2 řádky souboru
Před zobrazením tohoto příkladu si musíte být vědomi dvou zajímavých příkazů sed.
- P – který vytiskne první řádek vzorového prostoru. (do prvního \n).
- D – Odstraní první řádek z prostoru vzoru. Řízení poté přejde do horní části skriptu.
$ sed 'N;$!P;$!D;$d' thegeekstuff.txt Linux Sysadmin Databases - Oracle, mySQL etc. Databases - Oracle, mySQL etc. Security (Firewall, Network, Online Security etc) Storage in Linux Website Design
- Přečte první řádek a umístí jej do prostoru vzoru.
- Příkaz N přečte další řádek a připojí jej k prostoru se vzorem odděleným novým řádkem. (Nyní první řádek\ndruhý řádek)
- Pokud nedosáhne posledního řádku ($), vytiskněte první řádek a odstraňte pouze první řádek z prostoru vzoru. Poté cyklus začne znovu.
- Takto se spojí 2.\n3. řádek, 3.\n4. řádek a pokračuje.
- Aspoň když má 9.\n10. řádek v prostoru vzoru, dosáhne $, takže prostor se vzorem pouze smaže. ($!P a $!D se nevytisknou a nesmažou, pokud je $).
Příklad Sed 5. Tisk posledních 2 řádků souboru
$ sed '$!N;$!D' thegeekstuff.txt Website Design Windows- Sysadmin, reboot etc.
Výše uvedené spojuje a odstraňuje každý řádek, dokud v prostoru vzoru nebudou poslední dva řádky. Když dosáhne $, vytiskne prostor se vzorem, který bude mít pouze poslední dva řádky.
Sed Příklad 6. Odstranění duplicitních, po sobě jdoucích řádků ze souboru
Níže uvedený příkaz zkontroluje každý řádek spojený s dalším řádkem, zkontroluje, zda jsou oba stejné, pak netiskne prostor vzoru tisku (!P), stačí odstranit první řádek z prostoru vzoru. V prostoru vzorů tedy zůstane pouze jeden řádek.
$ sed '$!N; /^\(.*\)\n\1$/!P; D' thegeekstuff.txt Linux Sysadmin Databases - Oracle, mySQL etc. Security (Firewall, Network, Online Security etc) Storage in Linux Website Design Windows- Sysadmin, reboot etc.