logo

Sed Command v Linuxe/Unixe s príkladmi

Linuxový príkaz „sed“ znamená stream editor. Používa sa na úpravu streamov (súborov) pomocou regulárnych výrazov. Táto úprava však nie je trvalá. Zostáva iba na displeji, ale v skutočnosti zostáva obsah súboru rovnaký.

Primárne sa používa na nahradenie textu; okrem toho sa dá použiť na iné operácie s textom, ako je vkladanie, mazanie, vyhľadávanie a ďalšie. Príkaz sed nám umožňuje upravovať súbory bez ich otvárania. Podpora regulárneho výrazu z neho robí výkonnejší nástroj na manipuláciu s textom.

Prehľad príkazu sed

Je to unixový nástroj, ktorý transformuje a analyzuje text pomocou kompaktného a jednoduchého programovacieho jazyka. Integroval ho v rokoch 1973 až 1974 Lee E. McMahon z Bell Labs a dnes je prítomný takmer v každom operačnom systéme. Príkaz sed bol založený na skriptovacích aspektoch predchádzajúceho qed (rýchly editor) a interaktívneho editora ed. Bol to prvý nástroj na podporu regulárnych výrazov a zostáva aktívny na spracovanie textu, čo je najdôležitejšie pomocou príkazu na nahradenie. Medzi známe alternatívne nástroje patrí Perl a AWK for 'úprava streamu' a manipulácia s otvoreným textovým reťazcom.

Prevádzkový režim príkazu sed

Príkaz sed je riadkovo orientovaný nástroj na spracovanie textu: riadok po riadku číta text zo súboru alebo vstupného toku do internej vyrovnávacej pamäte známej ako priestor vzorov. Všetky čítania riadkov začínajú cyklus. Príkaz sed používa jednu alebo viacero operácií, ktoré boli popísané skriptom sed do priestoru vzorov. Prevádzkuje programovací jazyk pomocou približne 25 príkazov, ktoré popisujú operácie nad textom.

generátor náhodných čísel v c

Pre všetky vstupné riadky má príkaz sed zvyčajne za následok priestor vzoru a po vykonaní skriptu znova spustí cyklus s ďalším riadkom. Ďalšie vlastnosti konca skriptu sú dostupné z príkazov skriptu a možností nastavenia, napr. N na okamžité začlenenie ďalšieho riadku do priestoru vzoru, q na ukončenie, d na odstránenie priestoru so vzorom atď. Skript sed sa teda vzťahuje na telo slučky, ktoré iteruje zo streamline, v ktorom premenná slučky a samotná slučka sú udržiavané a implicitné pomocou sed.

  • Skript sed je možné opísať na príkazovom riadku alebo ho prečítať cez izolovaný súbor. V skripte sed môžu príkazy mať ďalšiu adresu v kontexte regulárnych výrazov alebo čísel riadkov. Adresa rozhoduje o tom, kedy sa príkaz vykoná. Napríklad 2d vykoná príkaz d (alebo delete) iba na 2. vstupnom riadku, zatiaľ čo /^ /d odstráni každý riadok začínajúci medzerou.
  • Priestor hold, izolovaný špeciálny buffer, môžu niektoré príkazy sed použiť na podržanie hromadiaceho sa textu medzi cyklami. Príkazový jazyk sed má iba dve premenné (priestor vzoru a priestor uloženia) a funkciu vetvenia podobnú GOTO. Jazyk je však Turingov úplný. Ezoterické sed skripty sú dostupné pre niekoľko hier ako tetris, šach, arkanoid a sokoban.
  • Hlavná slučka beží pre všetky riadky vstupného toku, pričom kontroluje skript sed na všetkých riadkoch vstupu. Riadky skriptu sed sú všetky párom vzor-akcia, ktorý predstavuje vzor na porovnávanie a ktorá akcia sa má implementovať, čo možno skopírovať ako podmienený príkaz. Predvolené akcie (priestor vzoru tlače, kopírovanie riadku do priestoru vzoru), vstupné a výstupné toky a pracovné premenné (priestor podržania a priestor vzoru) sú implicitné; je možné špecifikovať stručné jednoriadkové programy kvôli hlavnej slučke.

Použitie príkazu sed

    Príkaz na nahradenie
    Nižšie uvedený príklad predstavuje najviac príkazov a typické použitie príkazu sed, t.j. substitúcie. Použitie bolo skutočnou motiváciou pre príkaz sed:
    sed 's/regexp/replacement/g' inputFileName > outputFileNameĎalšie príkazy sed
    Pre jednoduché spracovanie s 25 príkazmi sú možné aj iné spôsoby. Napríklad nižšie používa možnosť d na odfiltrovanie riadkov, ktoré obsahujú iba medzery a koniec znaku riadku:
    sed '/^ *$/d' inputFileName
    Vyššie uvedený príklad používa niekoľko nižšie uvedených metaznakov regulárneho výrazu:
    • Strih (^) je rovnaký ako začiatok riadku.
    • Symbol dolára ($) je rovnaký ako dokončenie riadku.
    • Hviezdička (*) je rovnaká ako predchádzajúci výskyt viac alebo nula.
    • Symbol plus (+) je rovnaký ako jeden alebo viacero predchádzajúcich výskytov znaku.
    • Otáznik (?) je rovnaký ako predchádzajúci výskyt viac alebo nula.
    • Symbol bodky (.) je úplne rovnaký ako jeden znak.
    sed ako filter
    Príkaz sed sa často používa ako filter v potrubí pod Unixom:
    $generateData | sed 's/x/y/g'
    Program createData generuje údaje a príkaz sed vykoná malú zmenu dosadením x namiesto y.Súborové sed skripty
    Často je užitočné vložiť veľa príkazov sed, jeden príkaz na každý riadok, do súboru skriptu a použiť príznak -f na vykonanie príkazov zo súboru:
    sed -f subst.sed vstupnýNázovSúboru > NázovVýstupnéhoSúboru

Syntax:

 sed [OPTION]... {script-only-if-no-other-script} [input-file]... 

Možnosti:

Nasledujú niektoré možnosti príkazového riadka príkazu sed:

-n, --tichý, --tichý: Násilne nám umožňuje vytlačiť vzorový priestor.

-e skript, --expression=script: Používa sa na pridanie skriptu k príkazom, ktoré sa majú vykonať.

-f súbor-skriptu, --súbor=súbor-skriptu: Používa sa na pridanie obsahu súboru skriptu k príkazom, ktoré sa majú vykonať.

--follow-symlinks: používa sa na sledovanie symbolických odkazov pri spracovaní na mieste.

-i[SUFFIX], --na mieste[=SUFFIX]: používa sa na úpravu súborov na mieste (vytvára zálohu, ak je dodaná možnosť SUFFIX).

-l N, --dĺžka-riadku=N: Používa sa na určenie požadovanej dĺžky zalamovania riadkov pre príkaz `l'.

--posix: používa sa na zakázanie všetkých rozšírení GNU.

-E, -r, --regexp-extended: Umožňuje nám použiť rozšírené regulárne výrazy v skripte (pre prenosnosť použite POSIX -E).

-s, --oddelene: používa sa na to, aby sa súbory považovali skôr za samostatné než za jeden a pokračuje v dlhom prúde.

-- pieskovisko: Používa sa na prevádzku v režime sandbox.

-u, --unbuffered: Používa sa na načítanie minimálneho množstva údajov zo vstupných súborov a častejšie vypláchne výstupné vyrovnávacie pamäte.

-z, --null-data: Používa sa na oddelenie riadkov znakmi NUL.

--Pomoc: slúži na zobrazenie príručky pomocníka.

--verzia: Používa sa na zobrazenie informácií o verzii.

Príklady príkazu sed

Pozrime sa na nasledujúce príklady:

Aplikuje sa na adresár STDIN

Príkaz sed nie je obmedzený len na manipuláciu so súbormi; tiež ho môžeme použiť na adresár STDIN.

 echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/' 

Vyššie uvedené príkazy nahradia prvý text druhým textovým vzorom. Zvážte nasledujúci výstup:

Linux Sed Filter

Z vyššie uvedeného výstupu sme najprv vykonali príkaz 'sed' na reťazci 'class7', kde sa 'class' zmenilo na 'jtp' a 7 na 10. Potom sme vykonali príkaz 'sed' na streame 'msg.txt kde sa slovo „učiť“ zmení na „študovať“.

Globálna náhrada

V predchádzajúcom príklade neboli všetky slová „učiť sa“ upravené do „štúdia“. Na úpravu každého slova musíme použiť globálnu náhradu „g“. Upraví všetky zadané slová v súbore alebo reťazci.

javascriptový komentár

Syntax:

 command | sed 's///g' 

Zvážte nasledujúce príklady:

numpy sumácia
 echo class7 class9 | sed 's/class/jtp/g' cat msg.txt | sed 's/learn/study/g' 

Vyššie uvedené príkazy nahradia všetky zadané textové vzory. Zvážte nasledujúci výstup:

Linux Sed Filter

Z vyššie uvedeného výstupu vykonaním príkazu 'echo class7 class9 | sed 's/class/jtp/g'' celá 'trieda' sa skonvertuje na 'jtp' a príkazom 'cat msg.txt | sed 's/learn/study/g'' všetko 'učiť sa' bolo prevedené na 'štúdium'.

Odstránenie riadku

Voľba 'd' nám umožní odstrániť celý riadok zo súboru. Stačí zadať slovo z tohto riadku pomocou možnosti „d“ a tento riadok bude odstránený. Upozorňujeme však, že všetky riadky s rovnakým slovom budú odstránené. Bude sa vykonávať takto:

 cat | sed '//d' 

Zvážte nasledujúci príkaz:

 cat msg.txt | sed '/jtp/d' 

Vyššie uvedený príkaz odstráni riadky so slovom 'jtp'. Zvážte nasledujúci výstup:

Linux Sed Filter

Z vyššie uvedeného výstupu vykonaním príkazu 'cat msg.txt | sed '/jtp/d'' všetky riadky obsahujúce slovo 'jtp' sú vymazané.

Použitie príkazu Multiple sed

Voľba '-e' nám umožňuje vykonávať viacero príkazov sed naraz. Môžeme vykonať viac ako jednu operáciu sed vykonaním príkazu ako:

 sed -e ' ; ' 

Zvážte nasledujúci príkaz:

 sed -e 's/red/blue/; s/yellow/black/' exm.txt 

Vyššie uvedený príkaz použije všetky zadané operácie v súbore 'exm.txt'. Zvážte nasledujúci výstup:

Linux Sed Filter

Ako vidíme z vyššie uvedeného výstupu, všetky „červené“ slová sú nahradené „modrými“ a všetky „žlté“ slová sú nahradené „čiernymi“. Príkazy môžeme oddeliť aj takto:

 sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt 

Výsledok bude rovnaký ako vyššie uvedený príkaz.

Čítanie príkazov zo súboru

Príkazy sed môžeme uložiť do súboru a použiť ich naraz v akomkoľvek súbore. Dá sa to urobiť zadaním možnosti „-f“ takto:

 sed -f 

Z vyššie uvedeného príkazu je '' súbor, ktorý má zoznam príkazov sed. Zvážte nasledujúci príkaz:

 sed -f SedCommands exm.txt 

Vyššie uvedený príkaz použije všetky zadané príkazy v súbore 'SedCommand' na 'exm.txt'. Zvážte nasledujúci výstup:

Linux Sed Filter

Z vyššie uvedeného výstupu sme použili príkazy aplikované na predchádzajúci príklad. Takže výstup je rovnaký ako v predchádzajúcom príklade.

regresné testovanie v testovaní softvéru

Nahradenie znakov

Ako oddeľovač reťazcov môžeme použiť výkričník (!). Napríklad chceme nahradiť bash shell a nahradiť ho csh shellom v '/etc/passwd'. Ak to chcete urobiť, vykonajte nasledujúci príkaz:

 sed 's//bin/bash//bin/csh/' /etc/passwd 

Rovnaký výsledok môžeme dosiahnuť vykonaním nižšie uvedeného príkazu:

 sed 's!/bin/bash!/bin/csh!' /etc/passwd 

Obmedzenie sed

Základné použitie príkazu sed spracuje celý súbor. Môžeme však obmedziť príkaz sed a zadať ľubovoľný riadok. Existujú dva spôsoby, ako obmedziť príkaz sed:

  • Rozsah liniek.
  • Vzor, ktorý zodpovedá konkrétnej línii.

Môžeme poskytnúť číslo na určenie riadku takto:

 sed '3s/Red/Blue/' exm.txt 

Vyššie uvedený príkaz použije zadanú operáciu na treťom riadku. Zvážte nasledujúci výstup:

Linux Sed Filter

Z vyššie uvedeného výstupu je upravený iba riadok tri.

Môžeme tiež určiť rozsah riadkov. Ak chcete zadať rozsah riadkov, vykonajte príkaz takto:

 sed '1,3s/Red/Blue/' exm.txt 

Vyššie uvedený príkaz aktualizuje zadaný text v riadkoch 1 a 3. Zvážte nasledujúci výstup:

Linux Sed Filter

Vkladanie a pridávanie textu

Príznak „i“ a „a“ sa používa na vloženie a pripojenie textu k súboru. Príznak „i“ pridá text pred reťazec a príznak „a“ sa používa na pridanie textu za reťazec. Zvážte nasledujúci príkaz:

 echo 'Another Demo' | sed 'iFirst Demo' 

Vyššie uvedený príkaz vloží text pred text 'Iné demo'. Zvážte nasledujúci výstup:

Linux Sed Filter

Ak chcete pridať text, vykonajte príkaz takto:

 echo 'Another Demo' | sed 'aFirst Demo' 

Vyššie uvedený príkaz pripojí text. Zvážte nasledujúci výstup:

Linux Sed Filter

Úprava čiar

Príznak „c“ sa používa na úpravu konkrétneho riadku. Ak chcete upraviť riadok, vykonajte príkaz takto:

 sed '3cThis is a modified line.' exm.txt 

Vyššie uvedený príkaz aktualizuje riadok tri. Zvážte nasledujúci výstup:

Linux Sed Filter

Regulárny výraz môžeme použiť aj na aktualizáciu viacerých riadkov s rovnakým vzorom. Zvážte nasledujúci príkaz:

 sed '/Apple is /c Line updated.' exm.txt 

Vyššie uvedený príkaz aktualizuje všetky riadky s reťazcom „Apple is“. Zvážte nasledujúci výstup:

Linux Sed Filter

Transformácia postáv

Príznak „y“ sa používa na transformáciu znakov. Transformáciu postáv nemožno obmedziť na konkrétne udalosti. Ak chcete transformovať znaky, vykonajte príkaz takto:

susedné uhly
 sed 'y/abc/def/' exm.txt 

Vyššie uvedený príkaz transformuje znaky 'a', 'b', 'c' na 'd', 'e', ​​'f'. zvážte nasledujúci výstup:

Linux Sed Filter

Tlač čísel riadkov

Znak '=' sa používa na vytlačenie čísla riadku. Ak chcete vytlačiť číslo riadku, vykonajte príkaz takto:

 sed '=' exm.txt 

Vyššie uvedený príkaz zobrazí číslo riadku obsahu súboru. Zvážte nasledujúci výstup:

Linux Sed Filter

Znamienko rovnosti s voľbou '-n' určuje číslo riadku, ktorý obsahuje zodpovedajúci skript. Zvážte nasledujúci výstup:

 sed -n '/mango/=' exm.txt 

Vyššie uvedený príkaz zobrazí číslo riadku, ktorý obsahuje slovo 'mango'. Zvážte nasledujúci výstup:

Linux Sed Filter

Z vyššie uvedeného výstupu vidíme, že riadok číslo 2 má slovo „mango“.