logo

Naredba Sed u Linuxu/Unixu s primjerima

Linux 'sed' naredba je kratica za uređivač toka. Koristi se za uređivanje tokova (datoteka) korištenjem regularnih izraza. Ali ovo uređivanje nije trajno. Ostaje samo na zaslonu, ali u stvarnosti sadržaj datoteke ostaje isti.

Prvenstveno se koristi za zamjenu teksta; osim toga, može se koristiti za druge operacije manipulacije tekstom kao što su umetanje, brisanje, pretraživanje i još mnogo toga. Naredba sed nam omogućuje uređivanje datoteka bez otvaranja. Podrška za regularne izraze čini ga moćnijim alatom za manipulaciju tekstom.

Pregled naredbe sed

To je Unix uslužni program koji transformira i analizira tekst pomoću kompaktnog i jednostavnog programskog jezika. Integrirao ga je od 1973. do 1974. Lee E. McMahon iz Bell Labsa i danas je prisutan za gotovo svaki operativni sustav. Naredba sed temeljila se na aspektima skriptiranja ranijeg qed-a (brzi uređivač) i ed interaktivnog uređivača. Bio je to najraniji alat za podršku regularnim izrazima i ostaje aktivan za obradu teksta, što je najvažnije s naredbom zamjene. Poznati alternativni alati uključuju Perl i AWK za 'stream editing' i manipulacija nizovima otvorenog teksta.

Način rada naredbe sed

Naredba sed je uslužni program za obradu teksta koji je orijentiran na liniju: ona red po red čita tekst iz datoteke ili ulaznog toka u interni međuspremnik poznat kao prostor uzorka. Sva čitanja retka započinju ciklus. Naredba sed koristi jednu ili više operacija koje su opisane sed skriptom u prostoru uzorka. Upravlja programskim jezikom koristeći oko 25 naredbi koje opisuju operacije nad tekstom.

Za sve ulazne retke, naredba sed obično rezultira prostorom uzorka i ponovno pokreće ciklus sa sljedećim retkom nakon izvršavanja skripte. Druge prirode kraja skripte dostupne su iz naredbi skripte i opcija postavljanja, npr. N za odmah uključivanje sljedećeg retka u prostor uzorka, q za izlaz, d za uklanjanje prostora uzorka itd. Dakle, sed skripta odnosi se na tijelo petlje koje ponavlja iz strujne linije, u kojoj sed održava i implicitno održava varijablu petlje i samu petlju.

kako generirati slučajni broj u Javi
  • Sed skripta se može opisati u naredbenom retku ili pročitati kroz izoliranu datoteku. U sed skripti, naredbe mogu uzeti dodatnu adresu u kontekstu regularnih izraza ili brojeva redaka. Adresa odlučuje kada će se naredba izvršiti. Na primjer, 2d će samo izvršiti naredbu d (ili izbrisati) u 2. ulaznom retku, dok će /^ /d ukloniti svaki redak koji počinje razmakom.
  • Prostor za zadržavanje, izolirani posebni međuspremnik, mogu koristiti neke sed naredbe za držanje akumuliranog teksta između ciklusa. Naredbeni jezik sed-a ima samo dvije varijable (razmak uzorka i prostor zadržavanja) i funkciju grananja nalik na GOTO. Međutim, jezik je Turing-kompletan. Ezoterične sed skripte dostupne su za nekoliko igara kao što su tetris, šah, arkanoid i sokoban.
  • Glavna petlja radi za sve linije ulaznog toka, provjeravajući sed skriptu na svim linijama ulaza. Sve linije sed skripte su par uzorak-akcija, koji predstavlja uzorak za podudaranje i koju radnju implementirati, što se može kopirati kao uvjetna izjava. Zadane radnje (ispis prostora uzorka, kopiranje linije u prostor uzorka), ulazni i izlazni tokovi i radne varijable (prostor zadržavanja i prostor uzorka) su implicitni; moguće je specificirati sažete jednolinijske programe zbog glavne petlje.

Upotreba naredbe sed

    Naredba za zamjenu
    Donji primjer predstavlja najkomandniju i tipičniju upotrebu naredbe sed, tj. zamjenu. Upotreba je bila stvarna motivacija za naredbu sed:
    sed 's/regexp/replacement/g' inputFileName > outputFileNameOstale naredbe sed-a
    Mogući su i drugi načini za jednostavnu obradu s nekih 25 sed naredbi. Na primjer, u nastavku se koristi opcija d za filtriranje redaka koji sadrže samo razmake i kraj znaka retka:
    sed '/^ *$/d' inputFileName
    Gornji primjer koristi nekoliko dolje navedenih metaznakova regularnog izraza:
    • Karet (^) je isti kao početak retka.
    • Simbol dolara ($) je isti kao završetak retka.
    • Zvjezdica (*) je ista kao više ili nula pojavljivanja prethodnog znaka.
    • Simbol plus (+) isti je kao jedan ili više prethodnih znakova.
    • Upitnik (?) je isti kao više ili nula pojavljivanja prethodnog znaka.
    • Simbol točke (.) potpuno je isti kao jedan znak.
    sed kao filter
    Često se naredba sed koristi kao filter unutar cjevovoda pod Unixom:
    $generateData | sed 's/x/y/g'
    Program generateData generira podatke, a naredba sed čini malu promjenu zamjenom x umjesto y.Sed skripte temeljene na datotekama
    Često je korisno staviti mnogo sed naredbi, jednu naredbu po svakom retku, unutar datoteke skripte i koristiti oznaku -f za izvršavanje naredbi iz datoteke:
    sed -f subst.sed inputFileName > outputFileName

Sintaksa:

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

Mogućnosti:

Slijede neke opcije naredbenog retka naredbe sed:

-n, --tiho, --tiho: Snažno nam omogućuje ispis prostora uzorka.

-e skripta, --expression=skripta: Koristi se za dodavanje skripte naredbama koje treba izvršiti.

-f skriptna datoteka, --file=skriptna datoteka: Koristi se za dodavanje sadržaja datoteke skripte naredbama koje treba izvršiti.

--follow-symlinks: koristi se za praćenje simboličkih veza prilikom obrade na mjestu.

-i[SUFIKS], --in-place[=SUFIKS]: koristi se za uređivanje datoteka na mjestu (stvara sigurnosnu kopiju ako je uključena opcija SUFFIX).

-l N, --line-length=N: Koristi se za određivanje željene duljine prijelamanja retka za naredbu `l'.

--posix: koristi se za onemogućavanje svih GNU ekstenzija.

-E, -r, --regexp-extended: Omogućuje nam korištenje proširenih regularnih izraza u skripti (za prenosivost koristite POSIX -E).

-s, --odvojeno: koristi se za razmatranje datoteka kao zasebnih, a ne kao pojedinačnih i nastavlja dugi niz.

--sandbox: Koristi se za rad u sandbox modu.

-u, --bez međuspremnika: Koristi se za učitavanje minimalnih količina podataka iz ulaznih datoteka i češće ispire izlazne međuspremnike.

-z, --null-podaci: Koristi se za odvajanje redaka NUL znakovima.

--Pomozite: koristi se za prikaz priručnika za pomoć.

--verzija: Koristi se za prikaz informacija o verziji.

Primjeri naredbe sed

Pogledajmo sljedeće primjere:

Primjena u STDIN imenik

Naredba sed nije ograničena samo na manipuliranje datotekama; također, možemo ga primijeniti na STDIN imenik.

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

Gornje naredbe zamijenit će prvi tekst drugim uzorkom teksta. Razmotrite donji izlaz:

Linux Sed filtar

Iz gornjeg izlaza, prvo smo izvršili naredbu 'sed' na nizu 'class7' gdje je 'class' promijenjen u 'jtp', a 7 u 10. Zatim smo izvršili naredbu 'sed' na toku 'msg.txt' ' gdje se 'učiti' pretvara u 'učiti'.

Globalna zamjena

U prethodnom primjeru, sve riječi 'učiti' nisu bile uređene u 'učiti'. Da bismo uredili svaku riječ, moramo koristiti globalnu zamjenu 'g'. Uredit će sve navedene riječi u datoteci ili nizu.

namjera namjera

Sintaksa:

 command | sed 's///g' 

Razmotrite primjere u nastavku:

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

Gore navedene naredbe zamijenit će sve navedene uzorke teksta. Razmotrite donji izlaz:

Linux Sed filtar

Iz gornjeg izlaza, izvršavanjem naredbe 'echo class7 class9 | sed 's/class/jtp/g'' sav 'class' se pretvara u 'jtp' i naredbom 'cat msg.txt | sed 's/learn/study/g'' sav 'learn' je pretvoren u 'study'.

Uklanjanje linije

Opcija 'd' omogućit će nam uklanjanje cijelog retka iz datoteke. Trebamo samo navesti riječ iz tog retka s opcijom 'd' i taj će redak biti izbrisan. Ali imajte na umu da će svi redci koji imaju istu riječ biti izbrisani. Izvršit će se kao:

 cat | sed '//d' 

Razmotrite naredbu u nastavku:

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

Gornja naredba će izbrisati retke koji sadrže riječ 'jtp'. Razmotrite donji izlaz:

Linux Sed filtar

Iz gornjeg izlaza, izvršavanjem naredbe 'cat msg.txt | sed '/jtp/d'' brišu se svi redovi koji sadrže riječ 'jtp'.

Korištenje naredbe Multiple sed

Opcija '-e' omogućuje nam da izvršimo više sed naredbi odjednom. Možemo izvesti više od jedne sed operacije izvršavanjem naredbe kao:

 sed -e ' ; ' 

Razmotrite naredbu u nastavku:

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

Gornja naredba primijenit će sve navedene operacije u datoteci 'exm.txt'. Razmotrite donji izlaz:

pretvarački niz do danas
Linux Sed filtar

Kao što možemo vidjeti iz gornjeg izlaza, sve 'crvene' riječi zamijenjene su s 'plave', a sve 'žute' riječi zamijenjene su s 'crne.' Također možemo razdvojiti naredbe ovako:

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

Rezultat će biti isti kao i gornja naredba.

Čitanje naredbi iz datoteke

Možemo spremiti sed naredbe u datoteku i primijeniti ih odjednom u bilo kojoj datoteci. To se može učiniti navođenjem opcije '-f' na sljedeći način:

 sed -f 

Iz gornje naredbe, '' je datoteka koja ima popis naredbi sed. Razmotrite naredbu u nastavku:

 sed -f SedCommands exm.txt 

Gornja naredba primijenit će sve navedene naredbe u datoteci 'SedCommand' na 'exm.txt'. Razmotrite donji izlaz:

Linux Sed filtar

Iz gornjeg izlaza koristili smo naredbe primijenjene na raniji primjer. Dakle, rezultat je isti kao u prethodnom primjeru.

Zamjena znakova

Možemo koristiti uskličnik (!) kao razdjelnik niza. Na primjer, želimo zamijeniti bash ljusku i zamijeniti je csh ljuskom u '/etc/passwd'. Da biste to učinili, izvršite naredbu u nastavku:

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

Isti rezultat možemo postići izvršavanjem naredbe ispod:

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

Ograničavanje sed

Osnovna upotreba naredbe sed obrađuje cijelu datoteku. No, možemo ograničiti naredbu sed i odrediti bilo koju liniju. Postoje dva načina za ograničavanje naredbe sed:

  • Niz linija.
  • Uzorak koji odgovara određenoj liniji.

Možemo dati broj za navođenje linije na sljedeći način:

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

Gornja naredba primijenit će navedenu operaciju na treći redak. Razmotrite donji izlaz:

Linux Sed filtar

Iz gornjeg izlaza samo je redak tri izmijenjen.

Također možemo odrediti niz linija. Da biste odredili raspon redaka, izvršite naredbu na sljedeći način:

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

Gornja naredba će ažurirati navedeni tekst u recima 1 i 3. Razmotrite donji izlaz:

Linux Sed filtar

Umetanje i dodavanje teksta

Oznake 'i' i 'a' koriste se za umetanje i dodavanje teksta u datoteku. Zastavica 'i' će dodati tekst prije niza, a oznaka 'a' koristi se za dodavanje teksta nakon niza. Razmotrite naredbu u nastavku:

 echo 'Another Demo' | sed 'iFirst Demo' 

Gornja naredba će umetnuti tekst prije teksta 'Još jedan demo'. Razmotrite donji izlaz:

Linux Sed filtar

Da biste dodali tekst, izvršite naredbu na sljedeći način:

 echo 'Another Demo' | sed 'aFirst Demo' 

Gornja naredba će dodati tekst. Razmotrite donji izlaz:

Linux Sed filtar

Modificiranje linija

Oznaka 'c' koristi se za izmjenu određene linije. Da biste izmijenili liniju, izvršite naredbu na sljedeći način:

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

Gornja naredba ažurirat će redak tri. Razmotrite donji izlaz:

što je ymail
Linux Sed filtar

Također možemo koristiti regularni izraz za ažuriranje više od jednog redaka koji imaju isti uzorak. Razmotrite naredbu u nastavku:

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

Gornja naredba će ažurirati sve retke koji imaju niz 'Apple is'. Razmotrite donji izlaz:

Linux Sed filtar

Transformacija likova

Oznaka 'y' koristi se za transformaciju znakova. Transformacija likova ne može se ograničiti na određene pojave. Za transformaciju znakova, izvršite naredbu na sljedeći način:

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

Gornja naredba će transformirati znakove 'a', 'b', 'c' u 'd', 'e', ​​'f'. razmotrite donji izlaz:

Linux Sed filtar

Ispis brojeva redaka

Znak '=' koristi se za ispis broja retka. Za ispis broja retka izvršite naredbu na sljedeći način:

 sed '=' exm.txt 

Gornja naredba prikazat će broj retka sadržaja datoteke. Razmotrite donji izlaz:

Linux Sed filtar

Znak jednakosti s opcijom '-n' navodi broj retka koji sadrži odgovarajuću skriptu. Razmotrite donji izlaz:

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

Gornja naredba prikazat će broj retka koji sadrži riječ 'mango'. Razmotrite donji izlaz:

Linux Sed filtar

Iz gornjeg rezultata možemo vidjeti da redak broj 2 ima riječ 'mango'.