Pokročilý sed: správa textových prúdov v systéme Linux. Používanie textového editora streamovania sed v systéme Linux Ďalšie príkazy editora sed

Minule sme hovorili o funkciách v bash skriptoch, najmä o tom, ako ich volať z príkazového riadku. Našou dnešnou témou je veľmi užitočný nástroj na spracovanie reťazcových údajov – linuxová utilita s názvom sed. Často sa používa na prácu s textami vo forme log súborov, konfiguračných a iných súborov.



Ak vykonávate akúkoľvek manipuláciu s údajmi v bash skriptoch, budete sa chcieť oboznámiť s nástrojmi sed a gawk. Tu sa zameriame na sed a prácu s textami, pretože je to veľmi dôležitý krok na našej ceste cez obrovské rozlohy vývoja bash skriptov.

Teraz sa pozrieme na základy práce so sedom a tiež sa pozrieme na viac ako tri desiatky príkladov použitia tohto nástroja.

Základy práce so sed

Pomôcka sed sa nazýva streamingový textový editor. V interaktívnych textových editoroch, ako je nano, pracujete s textami pomocou klávesnice, upravujete súbory, pridávate, odstraňujete alebo meníte texty. Sed vám umožňuje upravovať dátové toky na základe súborov pravidiel špecifikovaných vývojárom. Takto vyzerá tento príkaz:

$sed súbor možností
Predvolene sed aplikuje pravidlá zadané pri volaní, vyjadrené ako množina príkazov, na STDIN . To vám umožňuje prenášať údaje priamo do sed.

Napríklad takto:

$ echo "Toto je test" | sed "s/test/iny test/"
Toto sa stane, keď spustíte tento príkaz.


Jednoduchý príklad volania sed

V tomto prípade sed nahrádza slovo „test“ v riadku odovzdanom na spracovanie slovami „iný test“. Na formulovanie pravidla pre spracovanie textu uzavretého v úvodzovkách sa používajú lomky. V našom prípade sme použili príkaz ako s/vzor1/vzor2/ . Písmeno „s“ je skratkou slova „náhrada“, to znamená, že máme náhradný príkaz. Sed, ktorý vykoná tento príkaz, prezrie prenášaný text a nahradí fragmenty v ňom nájdené (o ktorých si povieme nižšie) zodpovedajúce vzoru1 vzorom2.

Vyššie je primitívny príklad použitia sed, aby ste sa dostali do tempa. V skutočnosti je možné sed použiť v oveľa zložitejších scenároch spracovania textu, ako je napríklad práca so súbormi.

Nižšie je uvedený súbor obsahujúci časť textu a výsledky jeho spracovania pomocou tohto príkazu:

$ sed "s/test/ďalší test" ./myfile


Textový súbor a výsledky jeho spracovania

Používa rovnaký prístup, aký sme použili vyššie, ale teraz sed spracováva text uložený v súbore. Ak je však súbor dostatočne veľký, všimnete si, že sed spracováva údaje po častiach a zobrazuje to, čo je spracované na obrazovke, bez čakania na spracovanie celého súboru.

Sed nemení údaje v súbore, ktorý spracováva. Editor prečíta súbor, spracuje to, čo prečítal, a odošle výsledný výstup do STDOUT. Aby ste sa uistili, že sa zdrojový súbor nezmenil, stačí ho po prenose do sed otvoriť. V prípade potreby je možné výstup sed presmerovať do súboru, prípadne prepísať starý súbor. Ak poznáte jednu z predchádzajúcich v tejto sérii, ktorá sa zaoberá presmerovaním vstupných a výstupných tokov, mali by ste to zvládnuť.

Vykonanie sady príkazov pri volaní sed

Ak chcete vykonať viacero akcií s údajmi, použite pri volaní sed prepínač -e. Tu je napríklad postup, ako zorganizovať nahradenie dvoch textových fragmentov:

$ sed -e "s/Toto/To/; s/test/iny test/" ./myfile


Použitie prepínača -e pri volaní sed

Oba príkazy sa aplikujú na každý riadok textu zo súboru. Musia byť oddelené bodkočiarkou a medzi koncom príkazu a bodkočiarkou by nemala byť žiadna medzera.
Ak chcete pri volaní sed zadať viacero vzorov spracovania textu, môžete po zadaní prvej jednoduchej úvodzovky stlačiť Enter a potom zadať každé pravidlo na nový riadok, pričom nezabudnite na záverečnú úvodzovku:

$ sed -e " > s/Toto/To/ > s/test/iny test/" ./myfile
Toto sa stane po vykonaní príkazu prezentovaného v tomto formulári.


Ďalší spôsob práce so sed

Čítanie príkazov zo súboru

Ak máte veľa príkazov sed, ktoré je potrebné použiť na spracovanie textu, zvyčajne je najlepšie ich vopred zapísať do súboru. Ak chcete zadať súbor sed obsahujúci príkazy, použite prepínač -f:

Tu je obsah súboru mycommands:

S/This/Tam/ s/test/iný test/
Zavolajme sed a odovzdajme editorovi súbor s príkazmi a súbor na spracovanie:

$ sed -f mycommands myfile
Výsledok pri volaní takéhoto príkazu je podobný ako v predchádzajúcich príkladoch.


Použitie príkazového súboru pri volaní sed

Nahradiť príznaky príkazov

Pozrite sa bližšie na nasledujúci príklad.

$sed "s/test/iný test/" môj súbor
To je to, čo obsahuje súbor a čo sa získa, keď ho sed spracuje.


Zdrojový súbor a výsledky jeho spracovania

Príkaz nahradiť bežne spracováva viacriadkový súbor, ale nahradia sa iba prvé výskyty hľadaného textu na každom riadku. Ak chcete nahradiť všetky výskyty vzoru, musíte použiť príslušný príznak.

Schéma na písanie náhradného príkazu pri použití príznakov vyzerá takto:

S/vzor/náhrada/príznaky
Vykonanie tohto príkazu je možné upraviť niekoľkými spôsobmi.

  • Pri prenose čísla sa berie do úvahy poradové číslo výskytu vzoru v reťazci a práve tento výskyt bude nahradený.
  • Príznak g označuje, že by sa mali spracovať všetky výskyty vzoru v reťazci.
  • Príznak p označuje, že by sa mal vytlačiť obsah pôvodného reťazca.
  • Príznak súboru w hovorí príkazu, aby zapísal výsledky spracovania textu do súboru.
Zvážme použitie prvej verzie príkazu na nahradenie s uvedením polohy nahradeného výskytu požadovaného fragmentu:

$ sed "s/test/iný test/2" môj súbor

Vyvolanie príkazu na nahradenie označujúce polohu fragmentu, ktorý sa má nahradiť

Tu sme zadali ako príznak nahradenia číslo 2. To viedlo k tomu, že bol nahradený iba druhý výskyt požadovaného vzoru v každom riadku. Teraz skúsme príznak globálnej náhrady - g:

$ sed "s/test/iný test/g" môj súbor
Ako vidno z výstupných výsledkov, takýto príkaz nahradil všetky výskyty vzoru v texte.


Globálna náhrada

Príznak príkazu nahradiť p vám umožňuje vytlačiť riadky, kde sa našli zhody, zatiaľ čo voľba -n zadaná pri volaní sed potláča normálny výstup:

$ sed -n "s/test/iný test/p" môj súbor
Výsledkom je, že po spustení sed v tejto konfigurácii sa zobrazia iba riadky (v našom prípade jeden riadok), v ktorých sa nachádza zadaný textový fragment.


Pomocou príznaku príkazu nahradiť p

Použime príznak w, ktorý umožňuje uložiť výsledky spracovania textu do súboru:

$ sed "s/test/iný test/w výstup" môj súbor


Ukladanie výsledkov spracovania textu do súboru

Je jasne vidieť, že počas činnosti príkazu sa dáta vypisujú do , pričom spracované riadky sa zapisujú do súboru, ktorého názov je uvedený po w .

Oddeľovacie znaky

Predstavte si, že v súbore /etc/passwd nahradíte /bin/bash /bin/csh. Úloha nie je taká náročná:

$ sed "s/\/bin\/bash/\/bin\/csh/" /etc/passwd
Toto však nevyzerá veľmi dobre. Ide o to, že keďže sa ako oddeľovacie znaky používajú lomky, rovnaké znaky v reťazcoch odovzdaných do sed musia byť escapované. V dôsledku toho trpí čitateľnosť príkazu.

Našťastie nám sed umožňuje definovať vlastné oddeľovacie znaky, ktoré sa použijú v príkaze nahradiť. Oddeľovač je prvý znak, ktorý sa objaví po s:

$ sed "s!/bin/bash!/bin/csh!" /etc/passwd
V tomto prípade sa ako oddeľovač používa výkričník, v dôsledku čoho je kód ľahšie čitateľný a vyzerá oveľa prehľadnejšie ako predtým.

Výber textových fragmentov na spracovanie

Doteraz sme volali sed, aby spracoval celý prúd dát odovzdaných editorovi. V niektorých prípadoch musíte pomocou sed spracovať iba časť textu - konkrétny riadok alebo skupinu riadkov. Na dosiahnutie tohto cieľa môžete použiť dva prístupy:
  • Nastavte limit počtu riadkov, ktoré sa majú spracovať.
  • Zadajte filter, ktorého zodpovedajúce riadky je potrebné spracovať.
Uvažujme o prvom prístupe. Tu sú možné dve možnosti. Prvá, diskutovaná nižšie, zahŕňa špecifikáciu počtu jedného riadku, ktorý je potrebné spracovať:

$sed "2s/test/ďalší test/" môj súbor


Spracúva sa iba jeden riadok, číslo uvedené pri volaní sed

Druhou možnosťou je rozsah reťazcov:

$ sed "2,3s/test/ďalší test/" môj súbor


Spracovanie radu riadkov

Okrem toho môžete zavolať príkaz nahradiť, aby sa súbor spracoval od určitého riadku po koniec:

$ sed "2,$s/test/ďalší test/" môj súbor


Spracovanie súboru od druhého riadku po koniec

Aby bolo možné použiť príkaz nahradiť na spracovanie iba riadkov, ktoré zodpovedajú danému filtru, príkaz sa musí volať takto:

$ sed "/likegeeks/s/bash/csh/" /etc/passwd
Analogicky s tým, čo bolo diskutované vyššie, je šablóna odovzdaná pred názvom príkazu s.


Spracúvajú sa riadky, ktoré zodpovedajú filtru

Tu sme použili veľmi jednoduchý filter. Ak chcete plne využiť možnosti tohto prístupu, môžete použiť regulárne výrazy. Povieme si o nich v jednom z nasledujúcich materiálov tejto série.

Odstraňovanie riadkov

Pomôcka sed je užitočná nielen na nahradenie jednej sekvencie znakov v reťazcoch inou. S jeho pomocou, konkrétne pomocou príkazu d, môžete odstrániť riadky z textového prúdu.

Volanie príkazu vyzerá takto:

$sed "3d" môj súbor
Chceme, aby bol z textu odstránený tretí riadok. Upozorňujeme, že toto nie je súbor. Súbor zostane nezmenený, vymazanie ovplyvní iba výstup generovaný sed.


Odstránenie tretieho riadku

Ak pri volaní príkazu d nezadáte číslo riadku, ktorý sa má vymazať, vymažú sa všetky riadky v prúde.

Tu je návod, ako použiť príkaz d na rozsah reťazcov:

$sed "2,3d" môj súbor


Odstráňte rozsah riadkov

Tu je postup, ako odstrániť riadky začínajúce od daného a až po koniec súboru:

$sed "3,$d" môj súbor


Odstránenie riadkov na koniec súboru

Riadky je možné odstrániť aj pomocou nasledujúceho vzoru:

$ sed "/test/d" myfile


Odstránenie riadkov pomocou vzoru

Pri volaní d môžete zadať pár vzorov - riadky, v ktorých sa vzor vyskytuje, a tie, ktoré sú medzi nimi, sa vymažú:

$ sed "/druhý/,/štvrtý/d" môj súbor


Odstránenie rozsahu riadkov pomocou zástupných znakov

Vkladanie textu do streamu

Pomocou sed môžete vkladať údaje do textového toku pomocou príkazov i a a:
  • Príkaz i pridá nový riadok pred daný.
  • Príkaz a pridá nový riadok za daný.
Pozrime sa na príklad použitia príkazu i:

$ echo "Ďalší test" | sed "i\Prvý test"


Tím i

Teraz sa pozrime na príkaz a:

$ echo "Ďalší test" | sed "a\Prvý test"


Príkaz a

Ako vidíte, tieto príkazy pridávajú text pred alebo za údaje zo streamu. Čo ak potrebujete pridať čiaru niekde v strede?

Tu si pomôžeme uvedením čísla referenčnej čiary v prúde, alebo šablóne. Upozorňujeme, že adresovanie reťazcov ako rozsahu tu nebude fungovať. Zavolajte príkaz i s uvedením čísla riadku, pred ktorý musíte vložiť nový riadok:

$ sed "2i\Toto je vložený riadok." myfile


Príkaz i s číslom referenčného riadku

Urobme to isté s príkazom a:

$ sed "2a\Toto je pridaný riadok." myfile


Príkaz a s číslom referenčného riadku

Všimnite si rozdiel v tom, ako fungujú príkazy i a a. Prvý vloží nový riadok pred zadaný, druhý - za ním.

Výmena strún

Príkaz c vám umožňuje zmeniť obsah celého riadku textu v dátovom toku. Pri jej volaní musíte zadať číslo riadku, namiesto ktorého by sa mali do streamu pridať nové údaje:

$ sed "3c\Toto je upravený riadok." myfile


Výmena celého reťazca

Ak pri volaní príkazu použijete vzor vo forme obyčajného textu alebo regulárneho výrazu, všetky reťazce zodpovedajúce vzoru budú nahradené:

$ sed "/Toto je/c Toto je zmenený riadok textu." myfile


Výmena reťazcov pomocou vzoru

Výmena znakov

Príkaz y pracuje s jednotlivými znakmi a nahrádza ich podľa údajov, ktoré mu boli odovzdané pri volaní:

$sed "y/123/567/" môj súbor


Výmena znakov

Pri používaní tohto príkazu je potrebné vziať do úvahy, že sa vzťahuje na celý textový prúd, nemožno ho obmedziť na konkrétne výskyty znakov.

Zobrazovanie čísel riadkov

Ak zavoláte sed pomocou príkazu =, obslužný program vytlačí čísla riadkov v dátovom toku:

$sed "=" môj súbor


Zobrazovanie čísel riadkov

Editor streamu zobrazil čísla riadkov pred ich obsahom.

Ak tomuto príkazu odošlete vzor a použijete prepínač sed -n, vytlačia sa iba čísla riadkov zodpovedajúce vzoru:

$ sed -n "/test/=" môj súbor


Tlač čísel riadkov zodpovedajúcich vzoru

Čítanie vkladaných údajov zo súboru

Vyššie sme sa zamerali na techniky vkladania údajov do toku, pričom sme naznačili, čo je potrebné vložiť priamo pri volaní sed. Ako zdroj údajov môžete použiť aj súbor. Na tento účel použite príkaz r, ktorý vám umožní vložiť údaje zo zadaného súboru do streamu. Pri jeho volaní môžete zadať číslo riadku, za ktorý chcete vložiť obsah súboru alebo vzor.

Pozrime sa na príklad:

$sed "3r newfile" môj súbor


Vkladanie obsahu súboru do streamu

Tu bol obsah súboru newfile vložený za tretí riadok súboru myfile.

Toto sa stane, ak použijete vzor pri volaní príkazu r:

$ sed "/test/r newfile" môj súbor


Použitie zástupného znaku pri volaní príkazu r

Obsah súboru sa vloží za každý riadok, ktorý zodpovedá vzoru.

Príklad

Predstavme si takúto úlohu. Existuje súbor, v ktorom je určitá postupnosť znakov, ktorá je sama o sebe nezmyselná, ktorú treba nahradiť údajmi prevzatými z iného súboru. Menovite nech je to nový súbor, v ktorom sekvencia znakov DATA hrá úlohu zástupného symbolu. Dáta, ktoré je potrebné nahradiť DATA, sú uložené v dátovom súbore.

Tento problém môžete vyriešiť pomocou príkazov r a d editora streamu sed:

$ Sed "/DATA>/ ( r nový súbor d)" môj súbor


Nahradenie zástupného symbolu skutočnými údajmi

Ako vidíte, namiesto zástupného symbolu DATA pridal sed do výstupného toku dva riadky z dátového súboru.

Výsledky

Dnes sme sa pozreli na základy práce s editorom sed stream. V skutočnosti je sed obrovská téma. Jeho učenie sa dá porovnať s učením sa nového programovacieho jazyka, ale keď pochopíte základy, môžete ovládať sed na akejkoľvek úrovni, ktorú potrebujete. Vďaka tomu bude vaša schopnosť spracovávať texty s ním obmedzená iba vašou fantáziou.

To je na dnes všetko. Nabudúce si povieme niečo o jazyku awk na spracovanie dát.

Vážení čitatelia! Používate sed vo svojej každodennej práci? Ak áno, podeľte sa o svoje skúsenosti.

Minule sme hovorili o funkciách v bash skriptoch, najmä o tom, ako ich volať z príkazového riadku. Našou dnešnou témou je veľmi užitočný nástroj na spracovanie reťazcových údajov – linuxová utilita s názvom sed. Často sa používa na prácu s textami vo forme log súborov, konfiguračných a iných súborov.



Ak vykonávate akúkoľvek manipuláciu s údajmi v bash skriptoch, budete sa chcieť oboznámiť s nástrojmi sed a gawk. Tu sa zameriame na sed a prácu s textami, pretože je to veľmi dôležitý krok na našej ceste cez obrovské rozlohy vývoja bash skriptov.

Teraz sa pozrieme na základy práce so sedom a tiež sa pozrieme na viac ako tri desiatky príkladov použitia tohto nástroja.

Základy práce so sed

Pomôcka sed sa nazýva streamingový textový editor. V interaktívnych textových editoroch, ako je nano, pracujete s textami pomocou klávesnice, upravujete súbory, pridávate, odstraňujete alebo meníte texty. Sed vám umožňuje upravovať dátové toky na základe súborov pravidiel špecifikovaných vývojárom. Takto vyzerá tento príkaz:

$sed súbor možností
Predvolene sed aplikuje pravidlá zadané pri volaní, vyjadrené ako množina príkazov, na STDIN . To vám umožňuje prenášať údaje priamo do sed.

Napríklad takto:

$ echo "Toto je test" | sed "s/test/iny test/"
Toto sa stane, keď spustíte tento príkaz.


Jednoduchý príklad volania sed

V tomto prípade sed nahrádza slovo „test“ v riadku odovzdanom na spracovanie slovami „iný test“. Na formulovanie pravidla pre spracovanie textu uzavretého v úvodzovkách sa používajú lomky. V našom prípade sme použili príkaz ako s/vzor1/vzor2/ . Písmeno „s“ je skratkou slova „náhrada“, to znamená, že máme náhradný príkaz. Sed, ktorý vykoná tento príkaz, prezrie prenášaný text a nahradí fragmenty v ňom nájdené (o ktorých si povieme nižšie) zodpovedajúce vzoru1 vzorom2.

Vyššie je primitívny príklad použitia sed, aby ste sa dostali do tempa. V skutočnosti je možné sed použiť v oveľa zložitejších scenároch spracovania textu, ako je napríklad práca so súbormi.

Nižšie je uvedený súbor obsahujúci časť textu a výsledky jeho spracovania pomocou tohto príkazu:

$ sed "s/test/ďalší test" ./myfile


Textový súbor a výsledky jeho spracovania

Používa rovnaký prístup, aký sme použili vyššie, ale teraz sed spracováva text uložený v súbore. Ak je však súbor dostatočne veľký, všimnete si, že sed spracováva údaje po častiach a zobrazuje to, čo je spracované na obrazovke, bez čakania na spracovanie celého súboru.

Sed nemení údaje v súbore, ktorý spracováva. Editor prečíta súbor, spracuje to, čo prečítal, a odošle výsledný výstup do STDOUT. Aby ste sa uistili, že sa zdrojový súbor nezmenil, stačí ho po prenose do sed otvoriť. V prípade potreby je možné výstup sed presmerovať do súboru, prípadne prepísať starý súbor. Ak poznáte niektorý z predchádzajúcich článkov tejto série, ktorý hovorí o presmerovaní vstupných a výstupných tokov, mali by ste to zvládnuť.

Vykonanie sady príkazov pri volaní sed

Ak chcete vykonať viacero akcií s údajmi, použite pri volaní sed prepínač -e. Tu je napríklad postup, ako zorganizovať nahradenie dvoch textových fragmentov:

$ sed -e "s/Toto/To/; s/test/iny test/" ./myfile


Použitie prepínača -e pri volaní sed

Oba príkazy sa aplikujú na každý riadok textu zo súboru. Musia byť oddelené bodkočiarkou a medzi koncom príkazu a bodkočiarkou by nemala byť žiadna medzera.
Ak chcete pri volaní sed zadať viacero vzorov spracovania textu, môžete po zadaní prvej jednoduchej úvodzovky stlačiť Enter a potom zadať každé pravidlo na nový riadok, pričom nezabudnite na záverečnú úvodzovku:

$ sed -e " > s/Toto/To/ > s/test/iny test/" ./myfile
Toto sa stane po vykonaní príkazu prezentovaného v tomto formulári.


Ďalší spôsob práce so sed

Čítanie príkazov zo súboru

Ak máte veľa príkazov sed, ktoré je potrebné použiť na spracovanie textu, zvyčajne je najlepšie ich vopred zapísať do súboru. Ak chcete zadať súbor sed obsahujúci príkazy, použite prepínač -f:

Tu je obsah súboru mycommands:

S/This/Tam/ s/test/iný test/
Zavolajme sed a odovzdajme editorovi súbor s príkazmi a súbor na spracovanie:

$ sed -f mycommands myfile
Výsledok pri volaní takéhoto príkazu je podobný ako v predchádzajúcich príkladoch.


Použitie príkazového súboru pri volaní sed

Nahradiť príznaky príkazov

Pozrite sa bližšie na nasledujúci príklad.

$sed "s/test/iný test/" môj súbor
To je to, čo obsahuje súbor a čo sa získa, keď ho sed spracuje.


Zdrojový súbor a výsledky jeho spracovania

Príkaz nahradiť bežne spracováva viacriadkový súbor, ale nahradia sa iba prvé výskyty hľadaného textu na každom riadku. Ak chcete nahradiť všetky výskyty vzoru, musíte použiť príslušný príznak.

Schéma na písanie náhradného príkazu pri použití príznakov vyzerá takto:

S/vzor/náhrada/príznaky
Vykonanie tohto príkazu je možné upraviť niekoľkými spôsobmi.

  • Pri prenose čísla sa berie do úvahy poradové číslo výskytu vzoru v reťazci a práve tento výskyt bude nahradený.
  • Príznak g označuje, že by sa mali spracovať všetky výskyty vzoru v reťazci.
  • Príznak p označuje, že by sa mal vytlačiť obsah pôvodného reťazca.
  • Príznak súboru w hovorí príkazu, aby zapísal výsledky spracovania textu do súboru.
Zvážme použitie prvej verzie príkazu na nahradenie s uvedením polohy nahradeného výskytu požadovaného fragmentu:

$ sed "s/test/iný test/2" môj súbor

Vyvolanie príkazu na nahradenie označujúce polohu fragmentu, ktorý sa má nahradiť

Tu sme zadali ako príznak nahradenia číslo 2. To viedlo k tomu, že bol nahradený iba druhý výskyt požadovaného vzoru v každom riadku. Teraz skúsme príznak globálnej náhrady - g:

$ sed "s/test/iný test/g" môj súbor
Ako vidno z výstupných výsledkov, takýto príkaz nahradil všetky výskyty vzoru v texte.


Globálna náhrada

Príznak príkazu nahradiť p vám umožňuje vytlačiť riadky, kde sa našli zhody, zatiaľ čo voľba -n zadaná pri volaní sed potláča normálny výstup:

$ sed -n "s/test/iný test/p" môj súbor
Výsledkom je, že po spustení sed v tejto konfigurácii sa zobrazia iba riadky (v našom prípade jeden riadok), v ktorých sa nachádza zadaný textový fragment.


Pomocou príznaku príkazu nahradiť p

Použime príznak w, ktorý umožňuje uložiť výsledky spracovania textu do súboru:

$ sed "s/test/iný test/w výstup" môj súbor


Ukladanie výsledkov spracovania textu do súboru

Je jasne vidieť, že počas činnosti príkazu sa dáta vypisujú do STDOUT, pričom spracované riadky sa zapisujú do súboru, ktorého názov je uvedený po w.

Oddeľovacie znaky

Predstavte si, že v súbore /etc/passwd nahradíte /bin/bash /bin/csh. Úloha nie je taká náročná:

$ sed "s/\/bin\/bash/\/bin\/csh/" /etc/passwd
Toto však nevyzerá veľmi dobre. Ide o to, že keďže sa ako oddeľovacie znaky používajú lomky, rovnaké znaky v reťazcoch odovzdaných do sed musia byť escapované. V dôsledku toho trpí čitateľnosť príkazu.

Našťastie nám sed umožňuje definovať vlastné oddeľovacie znaky, ktoré sa použijú v príkaze nahradiť. Oddeľovač je prvý znak, ktorý sa objaví po s:

$ sed "s!/bin/bash!/bin/csh!" /etc/passwd
V tomto prípade sa ako oddeľovač používa výkričník, v dôsledku čoho je kód ľahšie čitateľný a vyzerá oveľa prehľadnejšie ako predtým.

Výber textových fragmentov na spracovanie

Doteraz sme volali sed, aby spracoval celý prúd dát odovzdaných editorovi. V niektorých prípadoch musíte pomocou sed spracovať iba časť textu - konkrétny riadok alebo skupinu riadkov. Na dosiahnutie tohto cieľa môžete použiť dva prístupy:
  • Nastavte limit počtu riadkov, ktoré sa majú spracovať.
  • Zadajte filter, ktorého zodpovedajúce riadky je potrebné spracovať.
Uvažujme o prvom prístupe. Tu sú možné dve možnosti. Prvá, diskutovaná nižšie, zahŕňa špecifikáciu počtu jedného riadku, ktorý je potrebné spracovať:

$sed "2s/test/ďalší test/" môj súbor


Spracúva sa iba jeden riadok, číslo uvedené pri volaní sed

Druhou možnosťou je rozsah reťazcov:

$ sed "2,3s/test/ďalší test/" môj súbor


Spracovanie radu riadkov

Okrem toho môžete zavolať príkaz nahradiť, aby sa súbor spracoval od určitého riadku po koniec:

$ sed "2,$s/test/ďalší test/" môj súbor


Spracovanie súboru od druhého riadku po koniec

Aby bolo možné použiť príkaz nahradiť na spracovanie iba riadkov, ktoré zodpovedajú danému filtru, príkaz sa musí volať takto:

$ sed "/likegeeks/s/bash/csh/" /etc/passwd
Analogicky s tým, čo bolo diskutované vyššie, je šablóna odovzdaná pred názvom príkazu s.


Spracúvajú sa riadky, ktoré zodpovedajú filtru

Tu sme použili veľmi jednoduchý filter. Ak chcete plne využiť možnosti tohto prístupu, môžete použiť regulárne výrazy. Povieme si o nich v jednom z nasledujúcich materiálov tejto série.

Odstraňovanie riadkov

Pomôcka sed je užitočná nielen na nahradenie jednej sekvencie znakov v reťazcoch inou. S jeho pomocou, konkrétne pomocou príkazu d, môžete odstrániť riadky z textového prúdu.

Volanie príkazu vyzerá takto:

$sed "3d" môj súbor
Chceme, aby bol z textu odstránený tretí riadok. Upozorňujeme, že toto nie je súbor. Súbor zostane nezmenený, vymazanie ovplyvní iba výstup generovaný sed.


Odstránenie tretieho riadku

Ak pri volaní príkazu d nezadáte číslo riadku, ktorý sa má vymazať, vymažú sa všetky riadky v prúde.

Tu je návod, ako použiť príkaz d na rozsah reťazcov:

$sed "2,3d" môj súbor


Odstráňte rozsah riadkov

Tu je postup, ako odstrániť riadky začínajúce od daného a až po koniec súboru:

$sed "3,$d" môj súbor


Odstránenie riadkov na koniec súboru

Riadky je možné odstrániť aj pomocou nasledujúceho vzoru:

$ sed "/test/d" myfile


Odstránenie riadkov pomocou vzoru

Pri volaní d môžete zadať pár vzorov - riadky, v ktorých sa vzor vyskytuje, a tie, ktoré sú medzi nimi, sa vymažú:

$ sed "/druhý/,/štvrtý/d" môj súbor


Odstránenie rozsahu riadkov pomocou zástupných znakov

Vkladanie textu do streamu

Pomocou sed môžete vkladať údaje do textového toku pomocou príkazov i a a:
  • Príkaz i pridá nový riadok pred daný.
  • Príkaz a pridá nový riadok za daný.
Pozrime sa na príklad použitia príkazu i:

$ echo "Ďalší test" | sed "i\Prvý test"


Tím i

Teraz sa pozrime na príkaz a:

$ echo "Ďalší test" | sed "a\Prvý test"


Príkaz a

Ako vidíte, tieto príkazy pridávajú text pred alebo za údaje zo streamu. Čo ak potrebujete pridať čiaru niekde v strede?

Tu si pomôžeme uvedením čísla referenčnej čiary v prúde, alebo šablóne. Upozorňujeme, že adresovanie reťazcov ako rozsahu tu nebude fungovať. Zavolajte príkaz i s uvedením čísla riadku, pred ktorý musíte vložiť nový riadok:

$ sed "2i\Toto je vložený riadok." myfile


Príkaz i s číslom referenčného riadku

Urobme to isté s príkazom a:

$ sed "2a\Toto je pridaný riadok." myfile


Príkaz a s číslom referenčného riadku

Všimnite si rozdiel v tom, ako fungujú príkazy i a a. Prvý vloží nový riadok pred zadaný, druhý - za ním.

Výmena strún

Príkaz c vám umožňuje zmeniť obsah celého riadku textu v dátovom toku. Pri jej volaní musíte zadať číslo riadku, namiesto ktorého by sa mali do streamu pridať nové údaje:

$ sed "3c\Toto je upravený riadok." myfile


Výmena celého reťazca

Ak pri volaní príkazu použijete vzor vo forme obyčajného textu alebo regulárneho výrazu, všetky reťazce zodpovedajúce vzoru budú nahradené:

$ sed "/Toto je/c Toto je zmenený riadok textu." myfile


Výmena reťazcov pomocou vzoru

Výmena znakov

Príkaz y pracuje s jednotlivými znakmi a nahrádza ich podľa údajov, ktoré mu boli odovzdané pri volaní:

$sed "y/123/567/" môj súbor


Výmena znakov

Pri používaní tohto príkazu je potrebné vziať do úvahy, že sa vzťahuje na celý textový prúd, nemožno ho obmedziť na konkrétne výskyty znakov.

Zobrazovanie čísel riadkov

Ak zavoláte sed pomocou príkazu =, obslužný program vytlačí čísla riadkov v dátovom toku:

$sed "=" môj súbor


Zobrazovanie čísel riadkov

Editor streamu zobrazil čísla riadkov pred ich obsahom.

Ak tomuto príkazu odošlete vzor a použijete prepínač sed -n, vytlačia sa iba čísla riadkov zodpovedajúce vzoru:

$ sed -n "/test/=" môj súbor


Tlač čísel riadkov zodpovedajúcich vzoru

Čítanie vkladaných údajov zo súboru

Vyššie sme sa zamerali na techniky vkladania údajov do toku, pričom sme naznačili, čo je potrebné vložiť priamo pri volaní sed. Ako zdroj údajov môžete použiť aj súbor. Na tento účel použite príkaz r, ktorý vám umožní vložiť údaje zo zadaného súboru do streamu. Pri jeho volaní môžete zadať číslo riadku, za ktorý chcete vložiť obsah súboru alebo vzor.

Pozrime sa na príklad:

$sed "3r newfile" môj súbor


Vkladanie obsahu súboru do streamu

Tu bol obsah súboru newfile vložený za tretí riadok súboru myfile.

Toto sa stane, ak použijete vzor pri volaní príkazu r:

$ sed "/test/r newfile" môj súbor


Použitie zástupného znaku pri volaní príkazu r

Obsah súboru sa vloží za každý riadok, ktorý zodpovedá vzoru.

Príklad

Predstavme si takúto úlohu. Existuje súbor, v ktorom je určitá postupnosť znakov, ktorá je sama o sebe nezmyselná, ktorú treba nahradiť údajmi prevzatými z iného súboru. Menovite nech je to nový súbor, v ktorom sekvencia znakov DATA hrá úlohu zástupného symbolu. Dáta, ktoré je potrebné nahradiť DATA, sú uložené v dátovom súbore.

Tento problém môžete vyriešiť pomocou príkazov r a d editora streamu sed:

$ Sed "/DATA>/ ( r nový súbor d)" môj súbor


Nahradenie zástupného symbolu skutočnými údajmi

Ako vidíte, namiesto zástupného symbolu DATA pridal sed do výstupného toku dva riadky z dátového súboru.

Výsledky

Dnes sme sa pozreli na základy práce s editorom sed stream. V skutočnosti je sed obrovská téma. Jeho učenie sa dá porovnať s učením sa nového programovacieho jazyka, ale keď pochopíte základy, môžete ovládať sed na akejkoľvek úrovni, ktorú potrebujete. Vďaka tomu bude vaša schopnosť spracovávať texty s ním obmedzená iba vašou fantáziou.

To je na dnes všetko. Nabudúce si povieme niečo o jazyku awk na spracovanie dát.

Vážení čitatelia! Používate sed vo svojej každodennej práci? Ak áno, podeľte sa o svoje skúsenosti.

Minule sme hovorili o funkciách v bash skriptoch, najmä o tom, ako ich volať z príkazového riadku. Našou dnešnou témou je veľmi užitočný nástroj na spracovanie reťazcových údajov – linuxová utilita s názvom sed. Často sa používa na prácu s textami vo forme log súborov, konfiguračných a iných súborov.



Ak vykonávate akúkoľvek manipuláciu s údajmi v bash skriptoch, budete sa chcieť oboznámiť s nástrojmi sed a gawk. Tu sa zameriame na sed a prácu s textami, pretože je to veľmi dôležitý krok na našej ceste cez obrovské rozlohy vývoja bash skriptov.

Teraz sa pozrieme na základy práce so sedom a tiež sa pozrieme na viac ako tri desiatky príkladov použitia tohto nástroja.

Základy práce so sed

Pomôcka sed sa nazýva streamingový textový editor. V interaktívnych textových editoroch, ako je nano, pracujete s textami pomocou klávesnice, upravujete súbory, pridávate, odstraňujete alebo meníte texty. Sed vám umožňuje upravovať dátové toky na základe súborov pravidiel špecifikovaných vývojárom. Takto vyzerá tento príkaz:

$sed súbor možností
Predvolene sed aplikuje pravidlá zadané pri volaní, vyjadrené ako množina príkazov, na STDIN . To vám umožňuje prenášať údaje priamo do sed.

Napríklad takto:

$ echo "Toto je test" | sed "s/test/iny test/"
Toto sa stane, keď spustíte tento príkaz.


Jednoduchý príklad volania sed

V tomto prípade sed nahrádza slovo „test“ v riadku odovzdanom na spracovanie slovami „iný test“. Na formulovanie pravidla pre spracovanie textu uzavretého v úvodzovkách sa používajú lomky. V našom prípade sme použili príkaz ako s/vzor1/vzor2/ . Písmeno „s“ je skratkou slova „náhrada“, to znamená, že máme náhradný príkaz. Sed, ktorý vykoná tento príkaz, prezrie prenášaný text a nahradí fragmenty v ňom nájdené (o ktorých si povieme nižšie) zodpovedajúce vzoru1 vzorom2.

Vyššie je primitívny príklad použitia sed, aby ste sa dostali do tempa. V skutočnosti je možné sed použiť v oveľa zložitejších scenároch spracovania textu, ako je napríklad práca so súbormi.

Nižšie je uvedený súbor obsahujúci časť textu a výsledky jeho spracovania pomocou tohto príkazu:

$ sed "s/test/ďalší test" ./myfile


Textový súbor a výsledky jeho spracovania

Používa rovnaký prístup, aký sme použili vyššie, ale teraz sed spracováva text uložený v súbore. Ak je však súbor dostatočne veľký, všimnete si, že sed spracováva údaje po častiach a zobrazuje to, čo je spracované na obrazovke, bez čakania na spracovanie celého súboru.

Sed nemení údaje v súbore, ktorý spracováva. Editor prečíta súbor, spracuje to, čo prečítal, a odošle výsledný výstup do STDOUT. Aby ste sa uistili, že sa zdrojový súbor nezmenil, stačí ho po prenose do sed otvoriť. V prípade potreby je možné výstup sed presmerovať do súboru, prípadne prepísať starý súbor. Ak poznáte niektorý z predchádzajúcich článkov tejto série, ktorý hovorí o presmerovaní vstupných a výstupných tokov, mali by ste to zvládnuť.

Vykonanie sady príkazov pri volaní sed

Ak chcete vykonať viacero akcií s údajmi, použite pri volaní sed prepínač -e. Tu je napríklad postup, ako zorganizovať nahradenie dvoch textových fragmentov:

$ sed -e "s/Toto/To/; s/test/iny test/" ./myfile


Použitie prepínača -e pri volaní sed

Oba príkazy sa aplikujú na každý riadok textu zo súboru. Musia byť oddelené bodkočiarkou a medzi koncom príkazu a bodkočiarkou by nemala byť žiadna medzera.
Ak chcete pri volaní sed zadať viacero vzorov spracovania textu, môžete po zadaní prvej jednoduchej úvodzovky stlačiť Enter a potom zadať každé pravidlo na nový riadok, pričom nezabudnite na záverečnú úvodzovku:

$ sed -e " > s/Toto/To/ > s/test/iny test/" ./myfile
Toto sa stane po vykonaní príkazu prezentovaného v tomto formulári.


Ďalší spôsob práce so sed

Čítanie príkazov zo súboru

Ak máte veľa príkazov sed, ktoré je potrebné použiť na spracovanie textu, zvyčajne je najlepšie ich vopred zapísať do súboru. Ak chcete zadať súbor sed obsahujúci príkazy, použite prepínač -f:

Tu je obsah súboru mycommands:

S/This/Tam/ s/test/iný test/
Zavolajme sed a odovzdajme editorovi súbor s príkazmi a súbor na spracovanie:

$ sed -f mycommands myfile
Výsledok pri volaní takéhoto príkazu je podobný ako v predchádzajúcich príkladoch.


Použitie príkazového súboru pri volaní sed

Nahradiť príznaky príkazov

Pozrite sa bližšie na nasledujúci príklad.

$sed "s/test/iný test/" môj súbor
To je to, čo obsahuje súbor a čo sa získa, keď ho sed spracuje.


Zdrojový súbor a výsledky jeho spracovania

Príkaz nahradiť bežne spracováva viacriadkový súbor, ale nahradia sa iba prvé výskyty hľadaného textu na každom riadku. Ak chcete nahradiť všetky výskyty vzoru, musíte použiť príslušný príznak.

Schéma na písanie náhradného príkazu pri použití príznakov vyzerá takto:

S/vzor/náhrada/príznaky
Vykonanie tohto príkazu je možné upraviť niekoľkými spôsobmi.

  • Pri prenose čísla sa berie do úvahy poradové číslo výskytu vzoru v reťazci a práve tento výskyt bude nahradený.
  • Príznak g označuje, že by sa mali spracovať všetky výskyty vzoru v reťazci.
  • Príznak p označuje, že by sa mal vytlačiť obsah pôvodného reťazca.
  • Príznak súboru w hovorí príkazu, aby zapísal výsledky spracovania textu do súboru.
Zvážme použitie prvej verzie príkazu na nahradenie s uvedením polohy nahradeného výskytu požadovaného fragmentu:

$ sed "s/test/iný test/2" môj súbor

Vyvolanie príkazu na nahradenie označujúce polohu fragmentu, ktorý sa má nahradiť

Tu sme zadali ako príznak nahradenia číslo 2. To viedlo k tomu, že bol nahradený iba druhý výskyt požadovaného vzoru v každom riadku. Teraz skúsme príznak globálnej náhrady - g:

$ sed "s/test/iný test/g" môj súbor
Ako vidno z výstupných výsledkov, takýto príkaz nahradil všetky výskyty vzoru v texte.


Globálna náhrada

Príznak príkazu nahradiť p vám umožňuje vytlačiť riadky, kde sa našli zhody, zatiaľ čo voľba -n zadaná pri volaní sed potláča normálny výstup:

$ sed -n "s/test/iný test/p" môj súbor
Výsledkom je, že po spustení sed v tejto konfigurácii sa zobrazia iba riadky (v našom prípade jeden riadok), v ktorých sa nachádza zadaný textový fragment.


Pomocou príznaku príkazu nahradiť p

Použime príznak w, ktorý umožňuje uložiť výsledky spracovania textu do súboru:

$ sed "s/test/iný test/w výstup" môj súbor


Ukladanie výsledkov spracovania textu do súboru

Je jasne vidieť, že počas činnosti príkazu sa dáta vypisujú do STDOUT, pričom spracované riadky sa zapisujú do súboru, ktorého názov je uvedený po w.

Oddeľovacie znaky

Predstavte si, že v súbore /etc/passwd nahradíte /bin/bash /bin/csh. Úloha nie je taká náročná:

$ sed "s/\/bin\/bash/\/bin\/csh/" /etc/passwd
Toto však nevyzerá veľmi dobre. Ide o to, že keďže sa ako oddeľovacie znaky používajú lomky, rovnaké znaky v reťazcoch odovzdaných do sed musia byť escapované. V dôsledku toho trpí čitateľnosť príkazu.

Našťastie nám sed umožňuje definovať vlastné oddeľovacie znaky, ktoré sa použijú v príkaze nahradiť. Oddeľovač je prvý znak, ktorý sa objaví po s:

$ sed "s!/bin/bash!/bin/csh!" /etc/passwd
V tomto prípade sa ako oddeľovač používa výkričník, v dôsledku čoho je kód ľahšie čitateľný a vyzerá oveľa prehľadnejšie ako predtým.

Výber textových fragmentov na spracovanie

Doteraz sme volali sed, aby spracoval celý prúd dát odovzdaných editorovi. V niektorých prípadoch musíte pomocou sed spracovať iba časť textu - konkrétny riadok alebo skupinu riadkov. Na dosiahnutie tohto cieľa môžete použiť dva prístupy:
  • Nastavte limit počtu riadkov, ktoré sa majú spracovať.
  • Zadajte filter, ktorého zodpovedajúce riadky je potrebné spracovať.
Uvažujme o prvom prístupe. Tu sú možné dve možnosti. Prvá, diskutovaná nižšie, zahŕňa špecifikáciu počtu jedného riadku, ktorý je potrebné spracovať:

$sed "2s/test/ďalší test/" môj súbor


Spracúva sa iba jeden riadok, číslo uvedené pri volaní sed

Druhou možnosťou je rozsah reťazcov:

$ sed "2,3s/test/ďalší test/" môj súbor


Spracovanie radu riadkov

Okrem toho môžete zavolať príkaz nahradiť, aby sa súbor spracoval od určitého riadku po koniec:

$ sed "2,$s/test/ďalší test/" môj súbor


Spracovanie súboru od druhého riadku po koniec

Aby bolo možné použiť príkaz nahradiť na spracovanie iba riadkov, ktoré zodpovedajú danému filtru, príkaz sa musí volať takto:

$ sed "/likegeeks/s/bash/csh/" /etc/passwd
Analogicky s tým, čo bolo diskutované vyššie, je šablóna odovzdaná pred názvom príkazu s.


Spracúvajú sa riadky, ktoré zodpovedajú filtru

Tu sme použili veľmi jednoduchý filter. Ak chcete plne využiť možnosti tohto prístupu, môžete použiť regulárne výrazy. Povieme si o nich v jednom z nasledujúcich materiálov tejto série.

Odstraňovanie riadkov

Pomôcka sed je užitočná nielen na nahradenie jednej sekvencie znakov v reťazcoch inou. S jeho pomocou, konkrétne pomocou príkazu d, môžete odstrániť riadky z textového prúdu.

Volanie príkazu vyzerá takto:

$sed "3d" môj súbor
Chceme, aby bol z textu odstránený tretí riadok. Upozorňujeme, že toto nie je súbor. Súbor zostane nezmenený, vymazanie ovplyvní iba výstup generovaný sed.


Odstránenie tretieho riadku

Ak pri volaní príkazu d nezadáte číslo riadku, ktorý sa má vymazať, vymažú sa všetky riadky v prúde.

Tu je návod, ako použiť príkaz d na rozsah reťazcov:

$sed "2,3d" môj súbor


Odstráňte rozsah riadkov

Tu je postup, ako odstrániť riadky začínajúce od daného a až po koniec súboru:

$sed "3,$d" môj súbor


Odstránenie riadkov na koniec súboru

Riadky je možné odstrániť aj pomocou nasledujúceho vzoru:

$ sed "/test/d" myfile


Odstránenie riadkov pomocou vzoru

Pri volaní d môžete zadať pár vzorov - riadky, v ktorých sa vzor vyskytuje, a tie, ktoré sú medzi nimi, sa vymažú:

$ sed "/druhý/,/štvrtý/d" môj súbor


Odstránenie rozsahu riadkov pomocou zástupných znakov

Vkladanie textu do streamu

Pomocou sed môžete vkladať údaje do textového toku pomocou príkazov i a a:
  • Príkaz i pridá nový riadok pred daný.
  • Príkaz a pridá nový riadok za daný.
Pozrime sa na príklad použitia príkazu i:

$ echo "Ďalší test" | sed "i\Prvý test"


Tím i

Teraz sa pozrime na príkaz a:

$ echo "Ďalší test" | sed "a\Prvý test"


Príkaz a

Ako vidíte, tieto príkazy pridávajú text pred alebo za údaje zo streamu. Čo ak potrebujete pridať čiaru niekde v strede?

Tu si pomôžeme uvedením čísla referenčnej čiary v prúde, alebo šablóne. Upozorňujeme, že adresovanie reťazcov ako rozsahu tu nebude fungovať. Zavolajte príkaz i s uvedením čísla riadku, pred ktorý musíte vložiť nový riadok:

$ sed "2i\Toto je vložený riadok." myfile


Príkaz i s číslom referenčného riadku

Urobme to isté s príkazom a:

$ sed "2a\Toto je pridaný riadok." myfile


Príkaz a s číslom referenčného riadku

Všimnite si rozdiel v tom, ako fungujú príkazy i a a. Prvý vloží nový riadok pred zadaný, druhý - za ním.

Výmena strún

Príkaz c vám umožňuje zmeniť obsah celého riadku textu v dátovom toku. Pri jej volaní musíte zadať číslo riadku, namiesto ktorého by sa mali do streamu pridať nové údaje:

$ sed "3c\Toto je upravený riadok." myfile


Výmena celého reťazca

Ak pri volaní príkazu použijete vzor vo forme obyčajného textu alebo regulárneho výrazu, všetky reťazce zodpovedajúce vzoru budú nahradené:

$ sed "/Toto je/c Toto je zmenený riadok textu." myfile


Výmena reťazcov pomocou vzoru

Výmena znakov

Príkaz y pracuje s jednotlivými znakmi a nahrádza ich podľa údajov, ktoré mu boli odovzdané pri volaní:

$sed "y/123/567/" môj súbor


Výmena znakov

Pri používaní tohto príkazu je potrebné vziať do úvahy, že sa vzťahuje na celý textový prúd, nemožno ho obmedziť na konkrétne výskyty znakov.

Zobrazovanie čísel riadkov

Ak zavoláte sed pomocou príkazu =, obslužný program vytlačí čísla riadkov v dátovom toku:

$sed "=" môj súbor


Zobrazovanie čísel riadkov

Editor streamu zobrazil čísla riadkov pred ich obsahom.

Ak tomuto príkazu odošlete vzor a použijete prepínač sed -n, vytlačia sa iba čísla riadkov zodpovedajúce vzoru:

$ sed -n "/test/=" môj súbor


Tlač čísel riadkov zodpovedajúcich vzoru

Čítanie vkladaných údajov zo súboru

Vyššie sme sa zamerali na techniky vkladania údajov do toku, pričom sme naznačili, čo je potrebné vložiť priamo pri volaní sed. Ako zdroj údajov môžete použiť aj súbor. Na tento účel použite príkaz r, ktorý vám umožní vložiť údaje zo zadaného súboru do streamu. Pri jeho volaní môžete zadať číslo riadku, za ktorý chcete vložiť obsah súboru alebo vzor.

Pozrime sa na príklad:

$sed "3r newfile" môj súbor


Vkladanie obsahu súboru do streamu

Tu bol obsah súboru newfile vložený za tretí riadok súboru myfile.

Toto sa stane, ak použijete vzor pri volaní príkazu r:

$ sed "/test/r newfile" môj súbor


Použitie zástupného znaku pri volaní príkazu r

Obsah súboru sa vloží za každý riadok, ktorý zodpovedá vzoru.

Príklad

Predstavme si takúto úlohu. Existuje súbor, v ktorom je určitá postupnosť znakov, ktorá je sama o sebe nezmyselná, ktorú treba nahradiť údajmi prevzatými z iného súboru. Menovite nech je to nový súbor, v ktorom sekvencia znakov DATA hrá úlohu zástupného symbolu. Dáta, ktoré je potrebné nahradiť DATA, sú uložené v dátovom súbore.

Tento problém môžete vyriešiť pomocou príkazov r a d editora streamu sed:

$ Sed "/DATA>/ ( r nový súbor d)" môj súbor


Nahradenie zástupného symbolu skutočnými údajmi

Ako vidíte, namiesto zástupného symbolu DATA pridal sed do výstupného toku dva riadky z dátového súboru.

Výsledky

Dnes sme sa pozreli na základy práce s editorom sed stream. V skutočnosti je sed obrovská téma. Jeho učenie sa dá porovnať s učením sa nového programovacieho jazyka, ale keď pochopíte základy, môžete ovládať sed na akejkoľvek úrovni, ktorú potrebujete. Vďaka tomu bude vaša schopnosť spracovávať texty s ním obmedzená iba vašou fantáziou.

To je na dnes všetko. Nabudúce si povieme niečo o jazyku awk na spracovanie dát.

Vážení čitatelia! Používate sed vo svojej každodennej práci? Ak áno, podeľte sa o svoje skúsenosti.

Úvod

Príkaz sed je Stream EDitor na automatickú úpravu textu. "Stream editor" - v tom zmysle, že môže priebežne upravovať prichádzajúci dátový tok, povedzme, ako súčasť programového kanála (pipe). Automaticky – to znamená, že akonáhle nastavíte pravidlá úprav, zvyšok prebehne bez vašej zdĺhavej účasti. Inými slovami, editor sed nie je interaktívny.

Program sed je zložitejší ako príkazy, o ktorých sme už hovorili v predchádzajúcich článkoch zo série HuMan. Obsahuje arzenál vlastných príkazov, preto, aby sa predišlo tautológii a zmätku, v tomto článku sa príkaz sed bude odteraz nazývať „program“ alebo „editor“ a príkazy editora sed sa budú nazývať jednoducho príkazy.

Program sed dokáže vykonávať zložité úlohy a naučiť sa, ako tieto úlohy formulovať, si vyžaduje čas.

Ale spolu s komplexnými akciami má príkaz sed jednoduché, ale veľmi užitočné schopnosti, ktoré nie je o nič ťažšie zvládnuť ako iné príkazy Unixu. Nenechajte sa strhnúť zložitosťou zvládnutia celého programu.

Začneme od jednoduchých po zložité, aby ste vždy vedeli, kde prestať.

Príkaz s - substitúcia (náhrada)

Program sed má veľa vlastných príkazov. Väčšina používateľov pozná iba príkaz s a to stačí na prácu s editorom sed. Príkaz s nahradí PATTERN príkazom REPLACE:

sed s/VZORKA/VYMENA/

$ echo deň | sed s/deň/noc/ (Enter) noc

Jednoduchšie to už nemôže byť. A tu je príklad so vstupom zo súboru zar.txt:

Ráno cvičil. Blesk je elektrický náboj. $ sed s/charge/discharge/ zar.txt Ráno urobil výtok. Blesk je elektrický výboj.

S/SAMPLE/REPLACE/ som nedal do úvodzoviek, pretože tento príklad nepotrebuje úvodzovky, ale ak by mal metaznaky, úvodzovky by sa vyžadovali. Aby ste si zakaždým nelámali hlavu a náhodou sa nepomýlili, vždy dávajte úvodzovky, najlepšie tie “silnejšie” single, to je dobrý zvyk. Kašu nemôžete pokaziť olejom. Ani ja nebudem šetriť úvodzovkami vo všetkých nasledujúcich príkladoch.

Ako vidíme, príkaz na výmenu s má štyri komponenty:

S samotný príkaz /.../.../ oddeľovač vzor VZOR pre vyhľadávanie a následné nahradenie výrazu REPLACE, ktorý nahradí VZOR, ak sa nejaký nájde.

Lomítko (/) sa tradične používa ako oddeľovač, pretože predchodca sed, editor ed, ich používa (rovnako ako editor vi). V niektorých prípadoch je takýto oddeľovač veľmi nepohodlný, napríklad keď potrebujete zmeniť cesty k adresárom, ktoré obsahujú aj lomku (/usr/local/bin). V tomto prípade musíte oddeliť predné lomky spätnými lomkami:

Sed "s/\/usr\/local\/bin/\/common\/bin/"

Toto sa nazýva „plot“ a vyzerá to veľmi škaredo a čo je najdôležitejšie, nepochopiteľné.

Na sed je jedinečné to, že vám umožňuje použiť akýkoľvek oddeľovač, ako napríklad podčiarknutie:

$ echo deň | sed s_den_noc_ noc

alebo dvojbodka:

$ echo deň | sed s:deň:noc:noc

Ak sa vám pri hľadaní oddeľovača, ktorý sa vám páči, zobrazí správa „incomplete `s command“, potom tento znak nie je dobrým oddeľovačom, alebo ste jednoducho zabudli zadať oddeľovač alebo dva.

V tomto článku musím použiť tradičný oddeľovač (/), aby som čitateľa nepomýlil, ale v prípade potreby použijem ako oddeľovač vlnovku (~).

regulárne výrazy (RE)

(regulárne výrazy, regulárny výraz, RE)

Téma regulárnych výrazov je taká rozsiahla, že sa jej venujú celé knihy (pozri odkazy na konci článku). Hovoriť vážne o editore sed bez použitia regulárnych výrazov je však rovnako kontraproduktívne ako hovoriť o trigonometrii pomocou pridávania palíc. Preto je potrebné hovoriť aspoň o tých regulárnych výrazoch, ktoré sa často používajú s programom sed.

s Alebo akýkoľvek iný list. Väčšina písmen, číslic a iných nešpeciálnych znakov sa považuje za regulárne výrazy, ktoré reprezentujú samy seba.

* Hviezdička za symbolom alebo regulárnym výrazom znamená akýkoľvek počet (vrátane nuly) opakovaní tohto symbolu alebo regulárneho výrazu.

\+ Označuje jedno alebo viac opakovaní znaku alebo regulárneho výrazu.

\? Znamená žiadne alebo jedno opakovanie.

\(i\) To znamená presne ja opakovania.

\(i,j\) Počet opakovaní je v rozmedzí od i do j vrátane.

\(i,\) Počet opakovaní je väčší alebo rovný i.

\(,j\) Počet opakovaní je menší alebo rovný j.

\(RE\) Zapamätajte si regulárny výraz alebo jeho časť pre budúce použitie ako celok. Napríklad \(a-z\)* vyhľadá akúkoľvek kombináciu ľubovoľného čísla (vrátane nuly) malých písmen.

. Zodpovedá ľubovoľnému znaku vrátane nového riadku.

^ Označuje nulový výraz na začiatku riadku. Inými slovami, čokoľvek, čomu predchádza tento znak, sa musí objaviť na začiatku riadku. Napríklad ^#include vyhľadá riadky začínajúce #include.

$ To isté ako predchádzajúce, platí len pre koniec riadku.

[ZOZNAM] Znamená ľubovoľný znak zo ZOZNAMU. Napríklad vyhľadá akúkoľvek anglickú samohlásku.

[^LIST] Znamená akýkoľvek znak okrem tých v zozname. Napríklad [^aeiou] vyhľadá akúkoľvek spoluhlásku. Poznámka: LIST môže byť interval, napríklad [a-z], čo bude znamenať akékoľvek malé písmeno. Ak potrebujete zahrnúť ] (hranaté zátvorky) do ZOZNAMU, uveďte ho ako prvé v zozname; ak potrebujete zahrnúť - (pomlčku) do ZOZNAMU, uveďte ho ako prvé alebo posledné v zozname.

RE1\|RE2 Znamená PB1 alebo PB2.

RE1RE2 Znamená spojenie regulárnych výrazov РВ1 a РВ2.

\n Označuje znak nového riadku.

\$; \*; \.; \[; \\; \^ Myslite podľa toho: $; *; .; [; \; ^

Pozor: Zostávajúce konvencie spätnej lomky (\) jazyka C nie sú podporované sed.

\1 \2 \3 \4 \5 \6 \7 \8 \9 Označuje zodpovedajúcu časť regulárneho výrazu uloženú pomocou znakov \(a \).

Niekoľko príkladov:

A b c d e f Znamená abcdef

a*b Predstavuje nulu alebo ľubovoľný počet a a jedno b. Napríklad aaaaaab; ab; alebo b.

a\?b Znamená b alebo ab

a\+b\+ Reprezentuje jedno alebo viac a a jedno alebo viac b. Napríklad: ab; aaaab; abbbbb; alebo aaaaaabbbbbbb.

.* Znamená všetky znaky na riadku, na všetkých riadkoch, vrátane prázdnych.

.\+ Zhoduje sa so všetkými znakmi v riadku, ale iba v riadkoch, ktoré obsahujú aspoň jeden znak. Prázdne reťazce nezodpovedajú tomuto regulárnemu výrazu.

^hlavne.*(.*) Vyhľadá riadky, ktoré začínajú slovom main a obsahujú aj otváracie a zatváracie zátvorky, pričom pred a za úvodnou zátvorkou môže byť ľubovoľný počet znakov (alebo nemusia byť žiadne).

^# Vyhľadá riadky začínajúce znakom # (napr. komentáre).

\\$ Vyhľadá riadky končiace spätnou lomkou (\).

Akékoľvek písmená alebo čísla

[^ ]\+ (Hratá zátvorka okrem symbolu ^ obsahuje aj medzeru a tabulátor) -- Znamená jeden alebo ľubovoľný počet ľubovoľných znakov okrem medzery a tabulátora. Zvyčajne to znamená slovo.

^.*A.*$ Označuje veľké A presne v strede riadku.

A.\(9\)$ Označuje veľké písmeno A, presne desiate písmeno od konca riadku.

^.\(,15\)A Označuje veľké písmeno A, presne šestnáste od začiatku riadku.

Teraz, keď sme videli niekoľko regulárnych výrazov, vráťme sa k príkazu s v sed.

Použitím symbolu &, keď je VZOR neznámy "Ako je neznámy?", sa pýtate: "Neviete, čo chcete nahradiť?" Odpoviem: Chcem dať do zátvoriek čísla nájdené v texte. Ako to spraviť? Odpoveď: použite symbol &.

Symbol & (ampersand), ak je umiestnený ako súčasť NÁHRADY, znamená akýkoľvek VZOR nájdený v texte. Napríklad:

$ echo 1234 | sed "s/*/(&)/" (1234)

Hviezdička (hviezdička) za intervalom je potrebná, aby sa nahradili všetky čísla nájdené vo vzorke. Bez toho by to bolo:

$ echo 1234 | sed "s//(&)/" (1)234

To znamená, že prvá nájdená číslica bola vzatá ako vzorka.

Tu je príklad s úplne zmysluplným zaťažením: vytvorme súbor formula.txt:

A+432-10=n

a aplikujte naň príkaz:

$ sed "s/*-*/(&)/" vzorec.txt a+(432-10)=n

Matematický vzorec nadobudol jednoznačný význam.

Ďalší symbol ampersandu možno použiť na zdvojnásobenie VZORU:

$ echo 123 | sed "s/*/& &/" 123 123

Je tu jedna jemnosť. Ak príklad trochu skomplikujeme:

$ echo "123 abc" | sed "s/*/& &/" 123 123 abc

ako by ste očakávali, iba čísla sú zdvojené, pretože vo VZORE nie sú žiadne písmená. Ak však vymeníme časti textu:

$ echo "abc 123" | sed "s/*/& &/" abc 123

potom nebude fungovať žiadne zdvojnásobenie čísel. Toto je vlastnosť regulárneho výrazu * – zhoduje sa iba s prvým znakom reťazca. Ak chceme zdvojnásobiť číslice, bez ohľadu na to, kde sú, musíme upraviť regulárny výraz v REPLACE:

$ echo "abc defg 123" | sed "s/*/& &/" abc defg 123 123

potom sa čísla zdvojnásobia, bez ohľadu na počet predchádzajúcich „slov“.

Použitie uniknutých zátvoriek \(, \) a \1 na spracovanie časti PATTERN Uvozené zátvorky \(a \) sa používajú na uloženie časti regulárneho výrazu.

Symbol \1 znamená prvú zapamätanú časť, \2 znamená druhú atď., až deväť zapamätaných častí (viac program nepodporuje). Pozrime sa na príklad:

$ echo abcd123 | sed "s/\(*\).*/\1/" abcd

Tu \(*\) znamená, že program si musí pamätať všetky abecedné znaky v akomkoľvek množstve; .* znamená ľubovoľný počet znakov po prvej zapamätanej časti; a \1 znamená, že chceme vidieť zapamätanú iba prvú časť. Správne: vo výstupe programu vidíme iba písmená a žiadne čísla.

Aby ste mohli zamieňať slová, musíte si zapamätať dva podVZORY a potom ich vymeniť:

$ echo hlúpy tučniak |sed "s/\([a-z]*\) \([a-z]*\)/\2 \1/" hlúpy tučniak

Tu \2 znamená druhý podVZOR a \1 znamená prvý. Všimnite si medzery medzi prvým výrazom \([a-z]*\) a druhým výrazom \([a-z]*\). Je potrebné, aby sa našli dve slová.

Znak \1 nemusí byť prítomný len v REPLACEMENTE, môže byť prítomný aj v SAMPLE, napríklad keď chceme odstrániť duplicitné slová:

$ echo tučniak tučniak | tučniak sed "s/\([a-z]*\) \1/\1/".

Modifikátory nahrádzania príkazov s

Náhradné modifikátory sú umiestnené za posledným oddeľovačom. Tieto modifikátory určujú, čo program urobí, ak existuje viac ako jedna zhoda so vzorom v reťazci, a ako vykonať nahradenie.

Modifikátor /g

Globálna náhrada

Program sed, podobne ako väčšina unixových pomôcok, pri práci so súbormi číta jeden riadok za druhým. Ak prikážeme nahradiť slovo, program nahradí len prvé slovo, ktoré sa zhoduje so VZOROM na danom riadku. Ak chceme zmeniť každé slovo, ktoré zodpovedá vzoru, mali by sme zadať modifikátor /g.

Bez modifikátora /g:

$ echo táto mačka bola najobyčajnejšia mačka | sed "s/cat/mačiatko/" toto mačiatko bolo tou najobyčajnejšou mačkou

Editor nahradil iba prvé slovo, ktoré sa zhodovalo.

A teraz s modifikátorom globálnej náhrady:

$ echo táto mačka bola najobyčajnejšia mačka | sed "s/cat/mačiatko/g" toto mačiatko bolo najobyčajnejšie mačiatko

Všetky zhody v tomto reťazci boli nahradené.

A ak potrebujete zmeniť všetky slová, povedzte, dajte ich do zátvoriek? Potom opäť prídu na pomoc regulárne výrazy. Ak chcete vybrať všetky abecedné znaky, veľké aj malé, môžete použiť konštrukciu [A-Ya-Ya], ale nebude obsahovať slová ako „niečo“ alebo „s“ezd.“ Konštrukcia [^] je oveľa viac pohodlné ]*, ktoré sa zhoduje so všetkými znakmi okrem medzery, takže:

$ echo hlúpy tučniak sa bojazlivo skrýva | sed "s/[^ ]*/(&)/g" (hlúpy) (tučniak) (plachý) (skrýva sa)

Ako si z viacerých vybrať tú správnu zhodu

Ak nepoužijete modifikátory, program sed nahradí iba prvé slovo, ktoré sa zhoduje so VZOROM. Ak použijete modifikátor /g, program nahradí každé zodpovedajúce slovo. Ako môžete vybrať jednu zo zhôd, ak ich je na rade niekoľko? - Pomocou konvenčných symbolov \(a \), ktoré už poznáme, si zapamätajte podVZORKY a pomocou symbolov \1 - \9 vyberte ten, ktorý potrebujete.

$ echo hlúpy tučniak | sed "s/\([a-z]*\) \([a-z]*\)/\2 /" tučniak

V tomto príklade sme si zapamätali obe slová a po umiestnení druhého (tučniaka) na prvé miesto sme prvé (hlúpe) odstránili vložením medzery na jeho miesto v časti NÁHRADA. Ak medzeru nahradíme slovom, nahradí to prvé (hlúpe):

$ echo hlúpy tučniak | sed "s/\([a-z]*\) \([a-z]*\)/\2 inteligentný /" inteligentný tučniak

Číselný modifikátor

Toto je jedno/dvoj/trojmiestne číslo, ktoré je umiestnené za posledným oddeľovačom a označuje, ktorá zhoda sa má nahradiť.

$ echo veľmi hlúpy tučniak | sed "s/[a-z]*/good/2" veľmi dobrý tučniak

V tomto príklade je každé slovo zhodné a editorovi sme povedali, ktoré slovo chceme nahradiť umiestnením modifikátora 2 za sekciu REPLACE.

Číselný modifikátor môžete kombinovať s modifikátorom /g. Ak potrebujete ponechať prvé slovo nezmenené a nahradiť druhé a nasledujúce slovom „(vymazané)“, príkaz bude vyzerať takto:

$ echo veľmi hlúpy tučniak | sed "s/[a-z]*/(vymazané)/2g" veľmi (vymazané) (vymazané)

Ak naozaj chcete odstrániť všetky nasledujúce zhody okrem prvej, mali by ste vložiť medzeru do sekcie REPLACE:

$ echo veľmi hlúpy tučniak | sed "s/[a-z]*/ /2g" veľmi

Alebo nevkladajte vôbec nič:

$ echo veľmi hlúpy tučniak | sed "s/[^ ]*//2g" je veľmi

Číselný modifikátor môže byť akékoľvek celé číslo od 1 do 512. Ak napríklad potrebujete vložiť dvojbodku za 80. znak každého riadku, príkaz vám pomôže:

$ sed "s/./&:/80" názov súboru

Modifikátor /p - výstup na štandardný výstup (tlač)

Program sed už štandardne vypisuje výsledok na štandardný výstup (napríklad na obrazovku monitora). Tento modifikátor sa používa iba s voľbou sed -n, ktorá len blokuje výstup výsledku na obrazovku.

Modifikátor /w

Umožňuje zapísať výsledky spracovania textu do určeného súboru:

$ sed "s/SAMPLE/REPLACE/w názov súboru

/e modifikátor (rozšírenie GNU)

Umožňuje vám zadať príkaz shellu (nie program sed) ako REPLACEMENT. Ak sa nájde zhoda so vzorom, bude nahradený výstupom príkazu špecifikovaného v sekcii REPLACE. Príklad:

$ echo noc | sed "s/noc/echo deň/e" deň

/I a /i modifikátory (rozšírenie GNU)

Proces výmeny nerozlišuje veľkosť písmen.

$ echo noc | sed "s/noc/deň/i" deň

Kombinácie modifikátorov

Modifikátory je možné kombinovať, keď to dáva zmysel. V tomto prípade by mal byť modifikátor w umiestnený ako posledný.

Konvencie (rozšírenie GNU) Je ich len päť:

\L prevedie znaky REPLACE na malé písmená \l prevedie nasledujúci znak REPLACE na malé písmeno \U prevedie REPLACE znaky na veľké písmená \u prevedie nasledujúci znak REPLACE na veľké písmeno \E zruší preklad spustený \L alebo \U Zo zrejmých dôvodov sa tieto konvencie používajú samostatne. Napríklad:

$ echo hlúpy tučniak | sed "s/stupid/\u&/" Hlúpy tučniak

$ echo malé šteniatko | sed "s/[a-z]*/\u&/2" malé šteniatko

Pokryli sme takmer každý aspekt príkazu sed. Teraz je čas pozrieť sa na možnosti tohto programu.

možnosti programu sed

Program má prekvapivo málo možností. (Čo trochu kompenzuje prebytok príkazov, modifikátorov a iných funkcií). Okrem dobre známych možností --help (-h) a --version (-V), ktoré nebudeme brať do úvahy, existujú iba tri z nich:

Možnosť -e--expression=sada_príkazov

Jedným zo spôsobov vykonania viacerých príkazov je použitie voľby -e. Napríklad:

Sed -e "s/a/A/" -e "s/b/B/" názov súboru

Všetky predchádzajúce príklady v tomto článku nevyžadovali voľbu -e jednoducho preto, že obsahovali jediný príkaz. V príkladoch sme mohli použiť možnosť -e, nič by to nezmenilo.

Možnosť -f Ak potrebujete vykonať veľké množstvo príkazov, je pohodlnejšie ich zapísať do súboru a použiť voľbu -f:

Sed -f názov súboru sedscript

Sedscript tu je názov súboru obsahujúceho príkazy. Tento súbor sa nazýva skript programu sed (ďalej len skript). Každý príkaz skriptu by mal zaberať samostatný riadok. Napríklad:

# komentár - Tento skript zmení všetky malé samohlásky na veľké samohlásky s/a/A/g s/e/E/g s/i/I/g s/o/O/g s/u/U/g

Skript si môžete pomenovať ako chcete, dôležité je nezameniť súbor skriptu so spracovávaným súborom.

Možnosť -n Program sed -n nevytlačí nič na štandardný výstup. Na prijatie výberu potrebujete špeciálny pokyn. Už sme sa zoznámili s modifikátorom /p, ktorý môže byť použitý na takéto označenie. Spomeňme si na súbor zar.txt:

$ sed "s/1-9/&/p" zar.txt Ráno cvičil. Blesk je elektrický náboj.

Keďže sa nenašli žiadne zhody so VZOROM (v súbore nie sú žiadne čísla), príkaz s s modifikátorom /p a znakom & ako REPLACEMENT (nezabudnite, že ampersand znamená samotný VZOR) funguje ako príkaz cat.

Ak sa v súbore nájde PATTERN, riadky obsahujúce PATTERN sa zdvojnásobia:

$ sed "s/cvicenie/&/p" zar.txt Ráno cvičil. Ráno cvičil. Blesk je elektrický náboj.

Teraz pridáme možnosť -n:

$ sed -n "s/cvicenie/&/p" zar.txt Ráno cvičil.

Teraz náš program funguje ako príkaz grep - vracia iba riadky obsahujúce PATTERN.

Výber požadovaných prvkov upravovaného textu

Pomocou jediného príkazu s sme videli neuveriteľné schopnosti editora sed. Ale všetko, čo robí, musí hľadať a nahradiť. Okrem toho počas prevádzky sed upravuje každý riadok jeden po druhom bez toho, aby venoval pozornosť ostatným. Bolo by vhodné obmedziť riadky, ktoré je potrebné zmeniť, napríklad:

  • Vyberte riadky podľa čísel
  • Vyberte riadky v určitom rozsahu čísel
  • Vyberte iba riadky obsahujúce určitý výraz
  • Vyberte iba riadky medzi niektorými výrazmi
  • Vyberte iba riadky od začiatku súboru po nejaký výraz
  • Vyberte iba riadky od nejakého výrazu po koniec súboru

To všetko a ešte viac dokáže program sed. Akýkoľvek príkaz editora sed možno použiť adresne, v určitom rozsahu adries alebo s vyššie uvedenými obmedzeniami rozsahu riadkov. Adresa alebo obmedzenie musí bezprostredne predchádzať príkazu:

Sed "príkaz adresy/obmedzenia"

Výber riadkov podľa čísel

Toto je najjednoduchší prípad. Stačí zadať číslo požadovaného riadku pred príkaz:

$ sed "4 s/[a-z]*//i" gumilev.txt Aká zvláštna blaženosť V skorom súmraku rána, V topení jarného snehu, na všetko hynúce a múdre.

$ sed "3 s/В/(В)/" gumilev.txt Aká zvláštna blaženosť V skorom súmraku rána, (V) topení jarného snehu, Vo všetkom, čo hynie a je múdre.

Výber riadkov v rozsahu čísel

Rozsah je uvedený, nie je prekvapujúce, oddelený čiarkami:

$ sed "2,3 s/В/(В)/" gumilev.txt Aká zvláštna blaženosť (V) skorý súmrak rána, (V) topenie jarného snehu, Vo všetkom, čo hynie a je múdre.

Ak potrebujete zadať rozsah až po posledný riadok súboru, ale neviete, koľko riadkov tam je, použite znak $:

$ sed "2,$ s/in/(in)/i" gumilev.txt Aká zvláštna blaženosť (v) skoré súmraku rána, (v) topenie jarného snehu, (v) všetko, čo hynie a je múdry.

Výber riadkov obsahujúcich výraz

Hľadaný výraz je uzavretý lomkami (/) a umiestnený pred príkazom:

$ sed "/morning/ s/in/(in)/i" gumilev.txt Aká zvláštna blaženosť (v) skorý súmrak rána, V topení jarného snehu, Vo všetkom, čo hynie a je múdre.

Výber riadkov v rozsahu medzi dvoma výrazmi

Rovnako ako v prípade čísel riadkov je rozsah špecifikovaný oddelený čiarkami:

$ sed "/rano/,/wise/ s/in/(in)/i" gumilev.txt Aká zvláštna blaženosť (v) skoré súmraku rána, (v) topenie jarného snehu, (v) všetkom ktorá hynie a múdro .

Výber riadkov od začiatku súboru po určitý výraz

$ sed "1,/snow/ s/in/(in)/i" gumilev.txt Aká zvláštna blaženosť (v) skoré súmraku rána, (v) topenie jarného snehu, Vo všetkom, čo hynie a je múdry.

Výber riadkov od určitého výrazu až po koniec súboru

$ sed "/snow/,$ s/in/(in)/i" gumilev.txt Aká zvláštna blaženosť Za skorého súmraku sa (v) topenie jarného snehu, (v) všetko, čo hynie a je múdry.

Ďalšie príkazy editora sed

d (vymazať) príkaz

Odstráni nasledujúce riadky zo štandardného výstupu:

$ sed "2 d" gumilev.txt Aká zvláštna blaženosť V topení jarného snehu, Vo všetkom, čo hynie a je múdre.

A častejšie to píšu jednoduchšie (bez medzery):

Sed "2d" gumilev.txt

Všetko, čo bolo povedané v predchádzajúcej časti o adresovaní reťazcov, platí aj pre príkaz d (rovnako ako pre takmer všetky príkazy v editore sed).

Pomocou príkazu d je vhodné zahodiť nepotrebnú „hlavičku“ niektorých e-mailových správ:

$ sed "1,/^$/d" názov súboru

(Vymažte riadky od prvého po prvý prázdny riadok).

Zbavte sa komentárov v konfiguračnom súbore:

$ sed "/^#/d" /boot/grub/menu.lst

A nikdy neviete, kde potrebujete odstrániť ďalšie čiary!

príkaz p (tlač).

Anglické slovo "print" sa prekladá ako "tlač", čo je v ruštine spojené s tlačiarňou alebo aspoň s klávesnicou. V skutočnosti toto slovo v anglickom kontexte často jednoducho znamená výstup na obrazovku monitora. Príkaz p teda nič nevytlačí, ale jednoducho zobrazí zadané riadky.

Keď sa príkaz p použije samostatne, zdvojnásobí riadky vo výstupe (koniec koncov, program sed štandardne vytlačí riadok na obrazovku, ale príkaz p vytlačí rovnaký riadok druhýkrát).

$ echo Mám mačku | sed "p" Mám mačku Mám mačku

Táto vlastnosť má využitie, napríklad zdvojenie prázdnych riadkov na zlepšenie vzhľadu textu:

$ sed "/^$/ p názov súboru

Príkaz p však odhalí svoje skutočné farby v kombinácii s voľbou -n, ktorá, ako si pamätáte, zabraňuje vytlačeniu čiar na obrazovke. Kombináciou voľby -n s príkazom p môžete vo výstupe získať iba požadované riadky.

Pozrite sa napríklad na riadky jeden až desať:

$ sed -n "1.10 p" názov súboru

Alebo len komentáre:

$ sed -n "/^#/ p" /boot/grub/menu.lst # konfiguračný súbor GRUB "/boot/grub/menu.lst". # generované "grubconfig". Ne 23. marec 2008 21:45:41 # # Spustiť globálnu sekciu GRUB # Ukončiť globálnu sekciu GRUB # Konfigurácia zavádzacej oblasti pre Linux sa začína # Konfigurácia zavádzacej oblasti pre Linux sa končí # Začína sa konfigurácia zavádzacej oblasti pre Linux # Konfigurácia zavádzacej oblasti pre Linux sa končí

Veľmi to pripomína program grep, s ktorým sme sa už stretli, keď sme hovorili o voľbe -n s modifikátorom /p. Na rozdiel od príkazu grep však editor sed umožňuje tieto riadky nielen nájsť, ale aj zmeniť, pričom napríklad všade Linux nahradí Unix:

$ sed -n "/^#/ p" /boot/grub/menu.lst | sed "s/Linux/Unix/" # konfiguračný súbor GRUB "/boot/grub/menu.lst". # generované "grubconfig". Ne 23. marec 2008 21:45:41 # # Spustiť globálnu sekciu GRUB # Ukončiť globálnu sekciu GRUB # Konfigurácia zavádzacieho oddielu pre Unix sa začína # Konfigurácia zavádzacieho oddielu pre Unix sa končí # Konfigurácia zavádzacieho oddielu pre Unix sa začína # Konfigurácia zavádzacieho oddielu pre Unix sa končí

Tím!

Niekedy je potrebné upraviť všetky riadky okrem tých, ktoré zodpovedajú vzoru alebo výberu. Znak výkričníka (!) obráti výber. Napríklad vymažeme všetky riadky okrem druhého z Gumilyovho štvorveršia:

$ sed "2 !d" gumilev.txt Za skorého rána,

Alebo vyberte všetky riadky, okrem komentárov, zo súboru /boot/grub/menu.lst:

$ sed -n "/^#/ !p" /boot/grub/menu.lst predvolený časový limit 1 20 gfxmenu (hd0,3)/boot/názov správy SuSe na (/dev/hda3) koreňovom jadre (hd0,2) /boot/vmlinuz root=/dev/hda3 ro vga=773 acpi=off title Linux na (/dev/hda4) root (hd0,3) jadro /boot/vmlinuz root=/dev/hda4 ro vga=0x317

Príkaz q (skončiť)

Príkaz q ukončí program sed po zadanom riadku. Je to praktické, ak potrebujete zastaviť úpravy po dosiahnutí určitého bodu v texte:

$sed "11 q" názov súboru

Tento príkaz skončí, keď dosiahne 11. riadok.

Príkaz q je jedným z mála príkazov sed, ktoré neakceptujú rozsahy reťazcov. Príkaz nemôže prestať fungovať 10-krát za sebou, ak zadáme:

Sed "1,10 q" Absurdné!

w (zápis) príkaz

Podobne ako modifikátor w príkazu s, aj tento príkaz vám umožňuje zapísať výstup programu do súboru:

$ sed -n "3,$ w gum.txt" gumilev.txt

Zo súboru gumilev.txt dostaneme súbor gum.txt obsahujúci posledné dva riadky Gumilyovovho štvorveršia. Navyše, ak takýto súbor už existuje, bude prepísaný. Ak nezadáte voľbu -n, tak program okrem vytvorenia súboru gum.txt zobrazí aj celý obsah súboru gumilev.txt.

Pre prácu na príkazovom riadku je pohodlnejšie použiť bežné presmerovanie výstupu (> alebo >>), ale v skriptoch sed si svoje využitie zrejme nájde príkaz w.

r (čítanie) príkaz

Tento príkaz nielen prečíta zadaný súbor, ale aj vloží jeho obsah na požadované miesto v upravovanom súbore. Na výber „správneho miesta“ sa používa nám už známe oslovovanie (číslami riadkov, výrazmi atď.). Príklad:

$ echo Z Gumilyovovej básne: | sed "r gumilev.txt"

Z Gumilyovovej básne:

Aká zvláštna blaženosť V rannom súmraku, V topení jarného snehu, Vo všetkom, čo hynie a je múdre.

Tím =

Uvedie číslo určeného riadku:

$ sed "/snow/=" gumilev.txt Aká zvláštna blaženosť V skorom súmraku rána, 3 V topení jarného snehu, Vo všetkom, čo hynie a je múdre.

$ sed -n "/snow/=" gumilev.txt 3

Príkaz akceptuje iba jednu adresu, neakceptuje intervaly.

Príkaz y

Tento príkaz nahrádza znaky zo sekcie PATTERN znakmi zo sekcie REPLACE a funguje ako program tr.

$ echo Auto - dedičstvo minulosti | sed "y/Auto/Paro/" Parné auto - dedičstvo minulosti

Tím r funguje iba vtedy, ak sa počet znakov vo VZORKU rovná počtu znakov v NÁHRADE.

skripty programu sed

Aby ste mohli používať editor sed ako plnohodnotný textový editor, musíte ovládať písanie sed skriptov. Program sed má svoj vlastný jednoduchý programovací jazyk, ktorý vám umožňuje písať skripty, ktoré dokážu zázraky.

Tento článok nemôže obsahovať popisy skriptov sed, rovnako ako si jeho autor nedáva za úlohu zvládnuť programovací jazyk sed. V tomto článku som sa zameral na používanie editora sed na príkazovom riadku s ohľadom na jeho použitie ako filtra v potrubí. Z tohto dôvodu som vynechal množstvo príkazov sed, ktoré sa používajú iba v skriptoch sed.

Existuje veľa fanúšikov editora sed a veľa článkov na tému skriptovania, a to aj na RuNet. Takže pre záujemcov o tento nádherný program nebude ťažké rozšíriť si svoje vedomosti.

Program sed a znaky azbuky

Ako je možné vidieť z príkladov v tomto článku, program sed na správne rusifikovanom systéme plynule hovorí „veľkým a výkonným“ jazykom.

sed Súhrn programu

Program sed je multifunkčný editor toku údajov, ktorý je nevyhnutný pre:

  • Úprava veľkých textových polí
  • Úprava súborov akejkoľvek veľkosti, keď je postupnosť úprav príliš zložitá
  • Úpravy údajov hneď, ako sú dostupné, a to aj v reálnom čase – teda v prípadoch, keď je ťažké alebo úplne nemožné použiť interaktívne textové editory.

Úplné zvládnutie programu sed bude trvať týždne alebo dokonca mesiace práce, pretože to vyžaduje:

  • Naučte sa regulárne výrazy
  • Naučte sa písať sed skripty zvládnutím jednoduchého programovacieho jazyka používaného v týchto skriptoch

Na druhej strane, zvládnuť niekoľko najbežnejších príkazov v editore sed nie je o nič ťažšie ako ktorýkoľvek príkaz Unix; Dúfam, že tento článok vám s tým pomôže.

Doslov

Doteraz som sa v článkoch série HuMan snažil aspoň stručne zverejniť každú možnosť, každý parameter príkazu popisovaný, aby článok nahradil manu. V budúcnosti sa budem naďalej držať tejto zásady.

Tento článok je výnimkou, pretože nepopisuje všetky funkcie programu. Ich úplný popis by si vyžadoval nie článok, ale knihu. Tento článok vám však umožňuje získať predstavu o editore sed a začať s týmto úžasným programom pomocou jeho najbežnejších príkazov.

Sed je ľahký (binárny váži iba 128 kilobajtov) a pohodlný nástroj na spracovanie textu.

V tomto článku uvediem niekoľko jednoduchých príkladov použitia sed a povie vám o jeho hlavných schopnostiach.

Sed vezme vstupný tok alebo súbor riadok po riadku, upraví každý riadok podľa pravidiel definovaných v skripte sed a potom vypíše výsledok. Sed je kompletný Turingov programovací jazyk.

formát príkazu sed

Príkaz sed má formát:

sed [ -n ] [ -e skript ] [ -f súbor skriptu ] [ súbory ]

Vlajka -n potláča výstup
-e- ukazuje na zoznam pokynov zadaných na príkazovom riadku.
-f- označuje umiestnenie súboru skriptu.

Upraviť formát príkazu

Súbor skriptu pozostáva zo sady príkazov:

[ adresa [ , adresa ] ] príkaz [ argumenty ]

jeden na každom riadku.
Adresy sú buď čísla riadkov, špeciálne znaky alebo regulárny výraz:

$ - posledný riadok
štart~N- Každý N-tý riadok začínajúci od čísla Štart
/regulárny výraz/- riadky, ktoré spadajú pod regulárny_výraz
Príklady:

1~2 - Každý druhý riadok /REGEXP/- všetky línie, v ktorých sa vyskytuje /REGEXP/ 10,20 - riadky od 10 do 20 10,+10 - riadky od 10 do 20 5,~N- riadky začínajúce od 5. do prvého násobku N 5,/REGEXP/- riadky obsahujúce /REGEXP/, po 5. (okrem 5.)
  • Ak nie je zadaná žiadna adresa, spracujú sa všetky riadky.
  • Ak je zadaná jedna adresa, spracuje sa príslušný riadok
  • Ak sú zadané dve adresy, vyberú sa riadky v zadanom intervale.
  • !tím- vykonané tím, pre riadky, ktoré neboli vybraté podľa adresy.

Základné príkazy

Pozrime sa na základné príkazy:

[adresa] text- pridať nový riadok s textom za zadaný riadok

$ cat sed_test sed_test_1 11111 sed_test_2 22222 sed_test_3 33333 $ sed -e "2 a new_line" sed_test sed_test_1 11111 sed_test_2 22222 new_line sed_test_3 33333

[adresa [, adresa]] c text- Odstráni vybrané riadky a nahradí ich text

$ sed -e "2 s novým_riadkom" sed_test sed_test_1 11111 nový_riadok sed_test_3 33333 $ sed -e "/3/ s novým_riadkom" sed_test sed_test_1 11111 sed_test_2 22222 nový_riadok

[adresa [, adresa]] d- Vymaže zadané riadky.

$ sed -e "2 d" sed_test sed_test_1 11111 sed_test_3 33333 $ sed -e "2!d" sed_test sed_test_2 22222

[adresa] i text- Vložte text namiesto určeného riadku.

$ sed -e "2 i nový_riadok" sed_test sed_test_1 11111 nový_text sed_test_2 22222 sed_test_3 33333

[adresa [, adresa]] str(s vlajkou -n) zobrazí nájdené riadky.

$ sed -ne "2p" sed_test sed_test_2 22222

[adresa]q- výstup zo sed.

[adresa [, adresa]] r súbor- Číta súbor a vypíše jej obsah.

[adresa [, adresa]] s/regex/replacement/flags- Nahrádza regulárny výraz na nahradenie- berúc do úvahy príznaky:

  • g - v celom riadku
  • i - nerozlišujú sa malé a veľké písmená
  • p - zobrazenie výsledku výmeny
$ sed -ne "s/t/T/g" sed_test sed_TesT_1 11111 sed_TesT_2 22222 sed_TesT_3 33333 $ sed -e "s//d/g" sed_test sed_test_d ddddd ddddd sed_test_dd sdd

[adresa [, adresa]] y/riadok1/riadok2/- Nahradí všetky výskyty znakov v riadok 1 zodpovedajúce symboly z linky2. Dĺžky čiar musia byť rovnaké.

$ sed -ne "y/est/EST/g" sed_test SEd_TEST_1 11111 SEd_TEST_2 22222 SEd_TEST_3 33333

[adresa[,adresa]] (príkazy)- zátvorky skupinové príkazy
[adresa] =- Dáva čísla riadkov

Tagy

: štítok- zhoda so skupinou príkazov štítok
b značka štítok, Ak štítok chýba, potom prejdite na koniec príkazového súboru.

t štítok- prejdite na príkaz označený štítkom štítok až po úspešnej výmene pomocou príkazu s///

Slučka vykonávania

sed pracuje s dvoma vyrovnávacími pamäťami údajov: hlavnou a pomocnou. Na začiatku sú obe vyrovnávacie pamäte prázdne.
Práca s týmito vyrovnávacími pamäťami sa vykonáva pomocou príkazov:\\`h‘, ,H‘, ,x‘, ,g‘, ,G‘ ,D‘ h- Nahraďte obsah pomocnej vyrovnávacej pamäte obsahom hlavnej
H- Pridajte nový riadok do pomocnej vyrovnávacej pamäte a potom pridajte obsah hlavnej vyrovnávacej pamäte k obsahu pomocnej pamäte
X- Vymeňte obsah oboch vyrovnávacích pamätí
g- Nahraďte obsah hlavného bufferu obsahom pomocného
G- Pridajte nový riadok do hlavnej vyrovnávacej pamäte a potom pridajte obsah pomocnej vyrovnávacej pamäte k obsahu hlavnej vyrovnávacej pamäte
D- Odstrániť text hlavnej vyrovnávacej pamäte až po ďalší znak nového riadku
N- Pridajte nový riadok do hlavnej vyrovnávacej pamäte a potom pridajte ďalší riadok, ktorý sa tam má spracovať
P- Vytlačte obsah hlavnej vyrovnávacej pamäte až po ďalší znak nového riadku.

Zložitejšie príklady

Nasledujúci skript vymení riadky súboru (prvé riadky sa stanú poslednými a naopak)

$ cat tac.sed #!/usr/bin/sed -nf # počnúc druhým riadkom sa obsah vyrovnávacej pamäte (ktorá už obsahuje # všetky predchádzajúce riadky) pripojí k aktuálnemu riadku. 1! G # pri dosiahnutí posledného riadku - tlač $ p # Zapíšte údaje do vyrovnávacej pamäte znova h sed -nf tac.sed sed_test sed_test_3 33333 sed_test_2 22222 sed_test_1 11111

Počítame riadky súboru (zobrazíme číslo posledného riadku)

$ cat count.sed #!/usr/bin/sed -nf $=

výsledok

$ sed -nf count.sed sed_test 3

Reverzácia strún

$ cat revers.sed #!/usr/bin/sed -f # preskočiť riadky obsahujúce jedno písmeno /../! b # Obráťte reťazec. Pridajte prázdny riadok pred a za aktuálny riadok. s/%$@~*!G4;:%#`.*$/\ &\ / # Presuňte prvý znak na koniec # cyklus funguje, pokiaľ sú v strednom riadku znaky. tx:x s/\(\\n.\)\(.*\)\(.\\n\)/\\3\\2\\1/ tx #odstráňte zbytočné konce riadkov s/\\n// g

Tento skript presúva dve písmená naraz.

$ sed -f revers.sed sed_test 11111 1_tset_des 22222 2_tset_des 33333 3_tset_des

Ďalšie informácie

Viac o formáte sed skriptov sa dozviete v príručke muž sed alebo technickej dokumentácie info sed.