logo

Comanda Sed în Linux/Unix cu exemple

Comanda Linux „sed” înseamnă editor de flux. Este folosit pentru a edita fluxuri (fișiere) folosind expresii regulate. Dar această editare nu este permanentă. Rămâne doar în afișare, dar în realitate, conținutul fișierului rămâne același.

În primul rând, este folosit pentru înlocuirea textului; în plus, poate fi folosit pentru alte operațiuni de manipulare a textului, cum ar fi inserarea, ștergerea, căutarea și multe altele. Comanda sed ne permite să edităm fișiere fără a le deschide. Suportul pentru expresia regulată îl face un instrument mai puternic de manipulare a textului.

model de design singleton java

Prezentare generală a comenzii sed

Este un utilitar Unix care transformă și analizează textul cu un limbaj de programare compact și simplu. A fost integrat din 1973 până în 1974 de Lee E. McMahon de la Bell Labs și este prezent astăzi pentru aproape fiecare sistem de operare. Comanda sed s-a bazat pe aspectele de scriptare ale qed (editor rapid) anterior și ale editorului interactiv ed. A fost cel mai vechi instrument pentru suportul expresiilor regulate și rămâne activ pentru procesarea textului, cel mai important cu comanda de înlocuire. Instrumentele alternative celebre includ Perl și AWK pentru „editare flux” și manipularea șirurilor de text simplu.

Modul de operare al comenzii sed

Comanda sed este un utilitar de procesare a textului orientat pe linie: linie cu linie citește textul dintr-un fișier sau dintr-un flux de intrare într-un buffer intern cunoscut sub numele de spațiu de model. Toate citirile de rând încep un ciclu. Comanda sed folosește una sau mai multe operații care au fost descrise de un script sed în spațiul de model. Acesta operează un limbaj de programare folosind aproximativ 25 de comenzi care descriu operațiunile peste text.

Pentru toate liniile de intrare, comanda sed are ca rezultat, de obicei, spațiul de tipar și începe ciclul cu următoarea linie din nou după executarea scriptului. Alte naturi de sfârșit de script sunt disponibile din comenzile de script și opțiunile de setare, de exemplu, N pentru a include imediat următoarea linie în spațiul de model, q pentru a ieși, d pentru a elimina spațiul de model și așa mai departe. Prin urmare, un script sed se referă la un corp de buclă care iterează dintr-un streamline, în care variabila buclă și bucla în sine sunt menținute și implicite de sed.

  • Un script sed poate fi fie descris pe linia de comandă, fie citit printr-un fișier izolat. În scriptul sed, comenzile pot lua o adresă suplimentară în contextul expresiilor regulate sau al numerelor de rând. Adresa decide când este executată comanda. De exemplu, 2d va executa comanda d (sau șterge) doar pe a doua linie de intrare, în timp ce /^ /d va elimina fiecare linie care începe cu un spațiu.
  • Spațiul de reținere, un buffer special izolat, poate fi folosit de unele comenzi sed pentru a păstra un text acumulat între cicluri. Limbajul de comandă al sed are doar două variabile (spațiu de model și spațiu de păstrare) și funcționalitate de ramificare asemănătoare GOTO. Cu toate acestea, limbajul este Turing-complet. Scripturile ezoterice sed sunt disponibile pentru mai multe jocuri precum tetris, șah, arkanoid și sokoban.
  • Bucla principală rulează pentru toate liniile fluxului de intrare, verificând scriptul sed pe toate liniile de intrare. Liniile de script sed sunt toate o pereche model-acțiune, reprezentând ce model pentru potrivire și ce acțiune să implementeze, care poate fi copiat ca o instrucțiune condiționată. Acțiunile implicite (tipăriți spațiul de tipar, copiați linia în spațiul de model), fluxurile de intrare și ieșire și variabilele de lucru (spațiu de păstrare și spațiu de model) sunt implicite; este posibil să se specifice programe concise cu o singură linie din cauza buclei principale.

Utilizarea comenzii sed

    Comanda de înlocuire
    Exemplul de mai jos reprezintă cea mai mare comandă și utilizarea tipică a comenzii sed, adică înlocuirea. Utilizarea a fost motivația reală pentru comanda sed:
    sed 's/regexp/replacement/g' inputFileName > outputFileNameAlte comenzi ale sed
    Sunt posibile și alte moduri de procesare simplă cu aproximativ 25 de comenzi sed. De exemplu, mai jos folosește opțiunea d pentru a filtra liniile care includ doar spații și sfârșitul caracterului de linie:
    sed '/^ *$/d' inputFileName
    Exemplul de mai sus folosește câteva dintre metacaracterele expresiei regulate de mai jos:
    • Indicatorul de caractere (^) este același cu începutul liniei.
    • Simbolul dolarului ($) este același cu completarea liniei.
    • Asteriscul (*) este același cu apariția anterioară a caracterului mai mult sau zero.
    • Simbolul plus (+) este același cu unul sau mai multe apariții anterioare de caractere.
    • Semnul întrebării (?) este același cu apariția anterioară a caracterului mai mult sau zero.
    • Simbolul punct (.) este exact același cu un caracter.
    sed ca filtru
    Adesea, comanda sed este folosită ca filtru în interiorul unei conducte sub Unix:
    $generateData | sed 's/x/y/g'
    Programul generateData generează date, iar comanda sed face o mică schimbare prin înlocuirea lui x în locul lui y.Scripturi sed bazate pe fișiere
    Adesea, este util să puneți mai multe comenzi sed, o singură comandă pe fiecare linie, în interiorul unui fișier script și să utilizați indicatorul -f pentru a executa comenzile din fișier:
    sed -f subst.sed inputFileName > outputFileName

Sintaxă:

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

Opțiuni:

Următoarele sunt câteva opțiuni de linie de comandă ale comenzii sed:

-n, --liniștit, --tăcut: Ne permite cu forță să tipărim spațiul de tipar.

-e script, --expression=script: Este folosit pentru a adăuga script-ul la comenzile care urmează să fie executate.

-f fișier-script, --file=fișier-script: Este folosit pentru a adăuga conținutul fișierului script la comenzile care urmează să fie executate.

--follow-symlinks: este folosit pentru a urmări legăturile simbolice atunci când se procesează pe loc.

-i[SUFIX], --in-place[=SUFIX]: este folosit pentru a edita fișiere în loc (creează o copie de rezervă dacă este furnizată opțiunea SUFFIX).

-l N, --lungimea liniei=N: Este folosit pentru a specifica lungimea dorită de înfăşurare a liniei pentru comanda `l'.

--posix: este folosit pentru a dezactiva toate extensiile GNU.

-E, -r, --regexp-extended: Ne permite să folosim expresiile regulate extinse în script (pentru portabilitate utilizați POSIX -E).

-s, --separate: este folosit pentru a considera fișierele ca fiind separate și nu ca un singur și continuă fluxul lung.

--cutie cu nisip: Este folosit pentru a funcționa în modul sandbox.

-u, --unbuffered: Este folosit pentru a încărca cantitățile minime de date din fișierele de intrare și șterge mai des tamponurile de ieșire.

-z, --null-data: Este folosit pentru a separa linii prin caractere NUL.

--Ajutor: este folosit pentru a afișa manualul de ajutor.

--versiune: Este folosit pentru a afișa informații despre versiune.

Exemple de comanda sed

Să vedem următoarele exemple:

turnat în sql

Se aplică în directorul STDIN

Comanda sed nu se limitează doar la manipularea fișierelor; de asemenea, îl putem aplica în directorul STDIN.

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

Comenzile de mai sus vor înlocui primul text cu al doilea model de text. Luați în considerare rezultatul de mai jos:

Linux Sed Filter

Din rezultatul de mai sus, mai întâi, am executat comanda „sed” pe un șir „class7” unde „class” este schimbat în „jtp” și 7 în 10. Apoi am executat comanda „sed” pe un flux „msg.txt”. unde „învățați” este convertit în „studiați”.

Înlocuire globală

În exemplul anterior, toate cuvintele „învățați” nu au fost modificate în „studiați”. Pentru a edita fiecare cuvânt, trebuie să folosim un înlocuitor global „g”. Acesta va edita toate cuvintele specificate într-un fișier sau șir.

Sintaxă:

 command | sed 's///g' 

Luați în considerare exemplele de mai jos:

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

Comenzile de mai sus vor înlocui tot modelul de text specificat. Luați în considerare rezultatul de mai jos:

Filtru Linux Sed

Din rezultatul de mai sus, executând comanda „echo class7 class9 | sed 's/class/jtp/g'' toată 'clasa' este convertită în 'jtp' şi cu comanda 'cat msg.txt | sed „s/learn/study/g” tot „learn” a fost convertit în „study”.

Eliminarea unei linii

Opțiunea „d” ne va permite să eliminăm o linie completă dintr-un fișier. Trebuie doar să specificăm un cuvânt din acea linie cu opțiunea „d”, iar linia respectivă va fi ștearsă. Dar, rețineți că toate liniile care au același cuvânt vor fi șterse. Se va executa astfel:

 cat | sed '//d' 

Luați în considerare comanda de mai jos:

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

Comanda de mai sus va șterge liniile care au cuvântul „jtp”. Luați în considerare rezultatul de mai jos:

Linux Sed Filter

Din rezultatul de mai sus, executând comanda „cat msg.txt | sed '/jtp/d'' toate liniile care conțin cuvântul 'jtp' sunt șterse.

Folosind comanda Multiple sed

Opțiunea „-e” ne permite să executăm mai multe comenzi sed simultan. Putem efectua mai mult de o operație sed executând comanda ca:

 sed -e ' ; ' 

Luați în considerare comanda de mai jos:

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

Comanda de mai sus va aplica toate operațiunile specificate în fișierul „exm.txt”. Luați în considerare rezultatul de mai jos:

Filtru Linux Sed

După cum putem vedea din rezultatul de mai sus, toate cuvintele „roșii” sunt înlocuite cu „albastru”, iar toate cuvintele „galbene” sunt înlocuite cu „negru”. De asemenea, putem separa comenzi astfel:

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

Rezultatul va fi același cu comanda de mai sus.

șir de convertor până în prezent

Citirea comenzilor dintr-un fișier

Putem salva comenzile sed într-un fișier și le putem aplica deodată în orice fișier. Se poate face prin specificarea opțiunii '-f' după cum urmează:

 sed -f 

Din comanda de mai sus, „” este un fișier care are o listă de comenzi sed. Luați în considerare comanda de mai jos:

 sed -f SedCommands exm.txt 

Comanda de mai sus va aplica toate comenzile specificate în fișierul „SedCommand” de pe „exm.txt”. Luați în considerare rezultatul de mai jos:

Filtru Linux Sed

Din rezultatul de mai sus, am folosit comenzi aplicate exemplului anterior. Deci, rezultatul este același ca exemplul anterior.

anulați ultima comitere

Înlocuirea personajelor

Putem folosi semnul exclamării (!) ca delimitator de șir. De exemplu, vrem să înlocuim shell-ul bash și să-l înlocuim cu shell-ul csh în „/etc/passwd”. Pentru a face acest lucru, executați comanda de mai jos:

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

Putem obține același rezultat executând comanda de mai jos:

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

Limitarea sedului

Utilizarea de bază a comenzii sed procesează întregul fișier. Dar, putem limita comanda sed și specifica orice linie. Există două moduri de a limita comanda sed:

  • O serie de linii.
  • Un model care se potrivește cu o anumită linie.

Putem furniza un număr pentru a specifica o linie după cum urmează:

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

Comanda de mai sus va aplica operația specificată pe a treia linie. Luați în considerare rezultatul de mai jos:

Linux Sed Filter

Din rezultatul de mai sus, doar linia trei este modificată.

De asemenea, putem specifica o serie de linii. Pentru a specifica un interval de linii, executați comanda după cum urmează:

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

Comanda de mai sus va actualiza textul specificat în rândurile 1 și 3. Luați în considerare rezultatul de mai jos:

Linux Sed Filter

Inserarea și adăugarea textului

Steagul „i” și „a” este folosit pentru a insera și adăuga textul într-un fișier. Steagul „i” va adăuga textul înaintea șirului, iar steagul „a” este folosit pentru a adăuga text după șir. Luați în considerare comanda de mai jos:

 echo 'Another Demo' | sed 'iFirst Demo' 

Comanda de mai sus va insera textul înainte de textul „O altă demonstrație”. Luați în considerare rezultatul de mai jos:

Linux Sed Filter

Pentru a adăuga text, executați comanda după cum urmează:

ex de nume de utilizator
 echo 'Another Demo' | sed 'aFirst Demo' 

Comanda de mai sus va adăuga textul. Luați în considerare rezultatul de mai jos:

Filtru Linux Sed

Modificarea liniilor

Steagul „c” este folosit pentru a modifica o anumită linie. Pentru a modifica o linie, executați comanda după cum urmează:

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

Comanda de mai sus va actualiza linia trei. Luați în considerare rezultatul de mai jos:

Linux Sed Filter

De asemenea, putem folosi o expresie regulată pentru a actualiza mai multe linii care au același model. Luați în considerare comanda de mai jos:

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

Comanda de mai sus va actualiza toate liniile care au șirul „Apple is”. Luați în considerare rezultatul de mai jos:

Filtru Linux Sed

Transformarea Personajelor

Steagul „y” este folosit pentru a transforma caracterele. Transformarea personajelor nu poate fi limitată la anumite apariții. Pentru a transforma caractere, executați comanda după cum urmează:

 sed 'y/abc/def/' exm.txt 

Comanda de mai sus va transforma caracterele „a”, „b”, „c” în „d”, „e”, „f”. luați în considerare rezultatul de mai jos:

Linux Sed Filter

Imprimarea numerelor de linie

Semnul „=” este folosit pentru a tipări numărul liniei. Pentru a imprima numărul liniei, executați comanda după cum urmează:

 sed '=' exm.txt 

Comanda de mai sus va afișa numărul de linie al conținutului fișierului. Luați în considerare rezultatul de mai jos:

Filtru Linux Sed

Semnul egal cu opțiunea „-n” specifică numărul liniei care conține un script care se potrivește. Luați în considerare rezultatul de mai jos:

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

Comanda de mai sus va afișa numărul de linie care conține cuvântul „mango”. Luați în considerare rezultatul de mai jos:

Filtru Linux Sed

Din rezultatul de mai sus, putem vedea că linia numărul 2 are cuvântul „mango”.