Tento článek je součástí probíhající série Unix Sed Tips and Tricks.
Jako každý jiný programovací jazyk, sed také poskytuje speciální větvené příkazy pro řízení toku programu.
V tomto článku se podíváme na následující dva typy větvení Sed.
- Sed Unconditional Branch
- Podmíněná větev Sed
Sed nepodmíněná syntaxe větve:
$ sed ':label command(s) b label'
- :label – specifikace štítku.
- příkazy – jakýkoli příkaz(y) sed
- štítek – libovolný název štítku
- štítek b – skočí na štítek bez kontroly jakýchkoli podmínek. Není-li popisek zadán, přeskočí se na konec skriptu.
Sed podmíněná syntaxe větve:
$ sed ':label command(s) t label'
- :label – specifikace štítku.
- příkazy – jakýkoli příkaz(y) sed
- štítek – libovolný název štítku
- štítek – skočí na popisek pouze v případě, že poslední náhradní příkaz upravil prostor vzoru. Není-li popisek zadán, přeskočí se na konec skriptu.
Vytvořte vzorový testovací soubor
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 Administration of Oracle Administration of Mysql Security Network Online\ Security Productivity Google Search\ Tips "Web Based Time Tracking, Web Based Todo list and Reduce Key Stores etc" $
I. Sed Příklady pro nepodmíněnou větev
Příklad Sed 1. Nahraďte první výskyt vzoru v celém souboru
V souboru thegeekstuff.txt nahraďte první výskyt „Administration“ na „Supervision“.
$ sed '/Administration/{ s/Administration/Supervision/ :loop n b loop }' thegeekstuff.txt Linux Supervision Scripting Tips and Tricks Windows Administration Database Administration of Oracle Administration of Mysql Security Network Online\ Security Productivity Google Search\ Tips "Web Based Time Tracking, Web Based Todo list and Reduce Key Stores etc"
- Ve výše uvedeném příkazu sed pouze čte řádek po řádku a tiskne prostor se vzorem, dokud neproběhne správa.
- Jakmile dojde k administraci, nahraďte administraci supervizí (pouze jeden výskyt, nezapomeňte, že při substituci není příznak „g“).
- Jakmile bude nahrazen první výskyt, stačí si přečíst zbývající obsah souboru a vytisknout.
- „n“ je příkaz sed, který vytiskne prostor se vzorem a přepíše jej dalším řádkem.
- Použil „loop“ jako štítek. „n“ vytiskne aktuální řádek a přepíše prostor se vzorem dalším řádkem. b smyčka skočí znovu na :loop. Tato smyčka tedy vytiskne zbývající obsah souboru thegeekstuff.txt.
Sed Příklad 2. Odstraňte data mezi vzorem ” ” v celém souboru
V našem vzorovém souboru jsou tři řádky mezi „“.
sed -e ':loop $!{ N /\n$/!b loop } s/\"[^\"]*\"//g' thegeekstuff.txt Linux Administration Scripting Tips and Tricks Windows Administration Database Administration of Oracle Administration of Mysql Security Network Online\ Security Productivity Google Search\ Tips $
- Výše uvedený příkaz keep připojí všechny řádky souboru, dokud nenastane konec souboru.
- $! – Pokud to není konec souboru.
- N – Připojte další řádek s mezerou ve vzoru oddělenou \n
- /\n$/!b smyčka – Pokud toto není poslední řádek souboru, přejděte znovu na smyčku.
- Nyní budou všechny řádky dostupné ve vzorovém prostoru odděleném novým řádkem. Nahraďte veškerý výskyt dat mezi ” prázdným.
Příklad Sed 3. Odstraňte HTML značky souboru
Řekněme, že mám soubor s následujícím obsahem html
$ cat index.html <html><body> <table border=2><tr><td valign=top align=right>1.</td> <td>Line 1 Column 2</ td> </table> </body></html>
Následující příkaz sed odstraní všechny html tagy z daného souboru
$ sed '/</{ :loop s/<[^<]*>//g /</{ N b loop } }' index.html 1. Line 1 Column 2
- Pokaždé, když najdete řádek obsahující znak „<“, nejprve odstraňte všechny značky HTML tohoto řádku.
- Pokud nyní prostor se vzorem obsahuje znak „<“, znamená to víceřádkovou značku. Nyní opakujte následující smyčku:
- Připojte se k dalšímu řádku
- Odstraňte všechny značky HTML, dokud nebude existovat žádný znak „<“
- Když v prostoru vzoru neexistuje žádné „<“, vytiskneme jej a spustíme nový cyklus.
II. Sed Příklady pro podmíněnou větev
Sed Příklad 4. Pokud řádek končí zpětným lomítkem, připojte k němu další řádek.
Náš ukázkový soubor má dva řádky zakončené zpětným lomítkem, nyní k němu musíme připojit jeho další řádek.
$ sed ' :loop /\\$/N s/\\\n */ / t loop' thegeekstuff.txt Linux Administration Scripting Tips and Tricks Windows Administration Database Administration of Oracle Administration of Mysql Security Network Online Security Productivity Google Search Tips "Web Based Time Tracking, Web Based Todo list and Reduce Key Stores etc"
- Zkontrolujte, zda řádek končí zpětným lomítkem (/\\$/), pokud ano, přečtěte si a připojte další řádek do mezery se vzorem a nahraďte znak \ na konci řádku a počet mezer za ním, s jedinou mezerou.
- Pokud je náhrada úspěšná, opakujte výše uvedený krok. Větev bude provedena pouze v případě úspěšného nahrazení.
- Podmíněné větvení většinou používané pro rekurzivní vzory.
Příklad Sed 5. Opravte číselné řetězce.
sed ' :loop s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/ t loop' 12342342342343434 12,342,342,342,343,434
- Seskupte číslice do dvou skupin.
- První skupina obsahuje všechny číslice až po poslední tři číslice. Poslední tři číslice se zachytí ve 2. skupině.
- Pak se dvě odpovídající skupiny oddělí čárkou. Poté se na řadu znovu a znovu použijí stejná pravidla, dokud nebudou všechna čísla seskupena do skupin po třech.
- Například v první iteraci to bude 12342342342343,434
- V další iteraci 12342342342,343,434 a pokračuje, dokud nebudou mít méně než tři číslice.
Sed Příklad 6. Formátování :Nahraďte každou úvodní mezeru řádku znakem „+“
$ sed ' s/^ */&\n/ :loop s/^\n//;s/ \n/\n+/ t loop' test Linux ++++++++Administration ++++++++Scripting ++++++++++++++++Tips and Tricks Windows ++++++++Administration Database ++++++++Administration of Oracle ++++++++Administration of Mysql Security ++++++++Network +++++++++++++++++Online\ ++++++++Security Productivity ++++++++Google Search\ ++++++++Tips ++++++++"Web Based Time Tracking, ++++++++Web Based Todo list and ++++++++Reduce Key Stores etc"
- Všechny úvodní mezery a další znaky řádku oddělte znakem nového řádku.
- Nyní nahraďte mezeru a nový řádek novými řádky a +. Mezera zprava doleva bude nahrazena znakem + a nový řádek bude o jeden znak posunut doleva.
- Konečně tam bude \n začátek řádku, takže tento nový řádek odstraňte.
Jak změnit heslo na Ubuntu
Jak vytvořit ASCII kresby v editoru Vim (kreslicí rámečky, čáry, elipsy, šipky uvnitř textového souboru)