logo

Ukaz Sed v Linuxu/Unixu s primeri

Linuxov ukaz 'sed' pomeni urejevalnik toka. Uporablja se za urejanje tokov (datotek) z uporabo regularnih izrazov. Vendar to urejanje ni trajno. Ostane le na zaslonu, dejansko pa ostane vsebina datoteke enaka.

Primarno se uporablja za zamenjavo besedila; poleg tega se lahko uporablja za druge operacije obdelave besedila, kot so vstavljanje, brisanje, iskanje in drugo. Ukaz sed nam omogoča urejanje datotek brez odpiranja. Zaradi podpore za regularne izraze je zmogljivejše orodje za obdelavo besedila.

Pregled ukaza sed

To je pripomoček Unix, ki pretvori in razčleni besedilo s kompaktnim in preprostim programskim jezikom. Med letoma 1973 in 1974 ga je integriral Lee E. McMahon iz Bell Labs in je danes prisoten v skoraj vseh operacijskih sistemih. Ukaz sed je temeljil na skriptnih vidikih prejšnjega qed (hitri urejevalnik) in interaktivnega urejevalnika ed. Bilo je najzgodnejše orodje za podporo regularnim izrazom in ostaja aktivno za obdelavo besedila, kar je najpomembnejše z ukazom za zamenjavo. Znana alternativna orodja vključujejo Perl in AWK za 'urejanje toka' in manipulacija nizov z navadnim besedilom.

Način delovanja ukaza sed

Ukaz sed je vrstično orientiran pripomoček za obdelavo besedila: vrstico za vrstico bere besedilo iz datoteke ali vhodnega toka v notranji medpomnilnik, znan kot prostor vzorcev. Vsa branja vrstic začnejo cikel. Ukaz sed uporablja eno ali več operacij, ki so bile opisane s skriptom sed v prostoru vzorca. Upravlja programski jezik z uporabo približno 25 ukazov, ki opisujejo operacije nad besedilom.

Za vse vhodne vrstice ukaz sed običajno povzroči prostor vzorca in znova začne cikel z naslednjo vrstico po izvedbi skripta. Druge narave konca skripta so na voljo v ukazih in nastavitvah skripta, npr. N za takojšnjo vključitev naslednje vrstice v prostor vzorca, q za izhod, d za odstranitev prostora vzorca itd. Zato se skript sed nanaša na telo zanke, ki se ponavlja iz poenostavljene linije, v kateri spremenljivko zanke in samo zanko vzdržuje in implicitno izvaja sed.

  • Skript sed lahko opišete v ukazni vrstici ali preberete prek izolirane datoteke. V skriptu sed lahko ukazi sprejmejo dodaten naslov v kontekstu regularnih izrazov ali številk vrstic. Naslov odloča, kdaj se ukaz izvede. Na primer, 2d bo samo izvedel ukaz d (ali izbriši) v 2. vhodni vrstici, medtem ko bo /^ /d odstranil vsako vrstico, ki se začne s presledkom.
  • Zadrževalni prostor, izoliran poseben medpomnilnik, lahko uporabljajo nekateri ukazi sed za shranjevanje nabranega besedila med cikli. Ukazni jezik sed ima samo dve spremenljivki (prostor vzorca in prostor za zadržanje) in funkcijo razvejanja, podobno GOTO. Vendar je jezik Turingovsko popoln. Ezoterični skripti sed so na voljo za več iger, kot so tetris, šah, arkanoid in sokoban.
  • Glavna zanka teče za vse vrstice vhodnega toka in preverja skript sed v vseh vrsticah vhoda. Vse vrstice skripta sed so par vzorec-dejanje, ki predstavlja vzorec za ujemanje in katero dejanje za implementacijo, kar je mogoče kopirati kot pogojni stavek. Privzeta dejanja (natisni prostor vzorca, kopiraj vrstico v prostor vzorca), vhodni in izhodni tokovi ter delovne spremenljivke (zadrži prostor in prostor vzorca) so implicitni; zaradi glavne zanke je mogoče določiti kratke enovrstične programe.

Uporaba ukaza sed

    Nadomestni ukaz
    Spodnji primer predstavlja najbolj ukazno in tipično uporabo ukaza sed, tj. zamenjavo. Uporaba je bila dejanska motivacija za ukaz sed:
    sed 's/regexp/replacement/g' inputFileName > outputFileNameDrugi ukazi sed
    Možni so tudi drugi načini za preprosto obdelavo s približno 25 ukazi sed. Spodaj na primer uporablja možnost d za filtriranje vrstic, ki vsebujejo samo presledke in konec znaka vrstice:
    sed '/^ *$/d' inputFileName
    Zgornji primer uporablja nekaj spodnjih metaznakov regularnega izraza:
    • Kazalica (^) je enaka začetku vrstice.
    • Simbol dolarja ($) je enak zaključku vrstice.
    • Zvezdica (*) je enaka kot več ali nič prejšnjih znakov.
    • Simbol plus (+) je enak enemu ali več prejšnjim pojavitvam znaka.
    • Vprašaj (?) je enak pojavu prejšnjega znaka več ali nič.
    • Simbol pike (.) je popolnoma enak enemu znaku.
    sed kot filter
    Pogosto se ukaz sed uporablja kot filter znotraj cevovoda pod Unixom:
    $generateData | sed 's/x/y/g'
    Program generateData ustvari podatke, ukaz sed pa naredi majhno spremembo tako, da nadomesti x namesto y.Datotečni skripti sed
    Pogosto je koristno, če v datoteko skripta postavite veliko ukazov sed, en ukaz na vsako vrstico, in uporabite zastavico -f za izvajanje ukazov iz datoteke:
    sed -f subst.sed inputFileName > outputFileName

Sintaksa:

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

Opcije:

Sledi nekaj možnosti ukazne vrstice ukaza sed:

-n, --tiho, --tiho: Močno nam omogoča tiskanje prostora vzorca.

-e skript, --izraz=skript: Uporablja se za dodajanje skripta ukazom, ki jih je treba izvesti.

-f skriptna datoteka, --file=skriptna datoteka: Uporablja se za dodajanje vsebine skriptne datoteke ukazom, ki jih je treba izvesti.

--follow-symlinks: uporablja se za sledenje simbolnim povezavam pri obdelavi na mestu.

-i[SUFIKS], --in-place[=SUFIKS]: uporablja se za urejanje datotek na mestu (ustvari varnostno kopijo, če je na voljo možnost SUFFIX).

-l N, --line-length=N: Uporablja se za določitev želene dolžine preloma vrstice za ukaz `l'.

--posix: uporablja se za onemogočanje vseh razširitev GNU.

-E, -r, --regexp-extended: Omogoča nam uporabo razširjenih regularnih izrazov v skriptu (za prenosljivost uporabite POSIX -E).

java dolgo v niz

-s, --ločeno: uporablja se za obravnavanje datotek kot ločenih in ne kot ene same in nadaljuje dolg tok.

--peskovnik: Uporablja se za delovanje v načinu peskovnika.

-u, --brez medpomnjenja: Uporablja se za nalaganje minimalnih količin podatkov iz vhodnih datotek in pogosteje izpira izhodne medpomnilnike.

-z, --null-data: Uporablja se za ločevanje vrstic z NUL znaki.

--pomoč: uporablja se za prikaz priročnika za pomoč.

--različica: Uporablja se za prikaz informacij o različici.

Primeri ukaza sed

Oglejmo si naslednje primere:

Uporaba v imeniku STDIN

Ukaz sed ni omejen le na upravljanje datotek; prav tako ga lahko uporabimo v imeniku STDIN.

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

Zgornji ukazi bodo nadomestili prvo besedilo z drugim besedilnim vzorcem. Razmislite o spodnjem rezultatu:

Linux Sed filter

Iz zgornjega izhoda smo najprej izvedli ukaz 'sed' na nizu 'class7', kjer je 'class' spremenjen v 'jtp' in 7 v 10. Nato smo izvedli ukaz 'sed' na toku 'msg.txt' ' kjer je 'learn' pretvorjen v 'study.'

Globalna zamenjava

V prejšnjem primeru vse besede 'learn' niso bile urejene v 'study'. Za urejanje vsake besede moramo uporabiti globalno zamenjavo 'g'. Uredil bo vse navedene besede v datoteki ali nizu.

Sintaksa:

 command | sed 's///g' 

Razmislite o spodnjih primerih:

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

Zgornji ukazi bodo nadomestili vse navedene besedilne vzorce. Razmislite o spodnjem rezultatu:

Linux Sed filter

Iz zgornjega izhoda z izvedbo ukaza 'echo class7 class9 | sed 's/class/jtp/g'' se vsi 'razredi' pretvorijo v 'jtp' in z ukazom 'cat msg.txt | sed 's/learn/study/g'' ves 'learn' je bil pretvorjen v 'study'.

Odstranjevanje črte

Možnost 'd' nam bo omogočila odstranitev celotne vrstice iz datoteke. Določiti moramo le besedo iz te vrstice z možnostjo 'd' in ta vrstica bo izbrisana. Vendar upoštevajte, da bodo vse vrstice, ki vsebujejo isto besedo, izbrisane. Izveden bo kot:

 cat | sed '//d' 

Razmislite o spodnjem ukazu:

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

Zgornji ukaz bo izbrisal vrstice z besedo 'jtp'. Razmislite o spodnjem rezultatu:

Linux Sed filter

Iz zgornjega izhoda z izvedbo ukaza 'cat msg.txt | sed '/jtp/d'' so izbrisane vse vrstice, ki vsebujejo besedo 'jtp'.

Uporaba ukaza Multiple sed

Možnost '-e' nam omogoča, da izvedemo več ukazov sed hkrati. Izvedemo lahko več kot eno operacijo sed tako, da izvedemo ukaz kot:

 sed -e ' ; ' 

Razmislite o spodnjem ukazu:

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

Zgornji ukaz bo uporabil vse navedene operacije v datoteki 'exm.txt'. Razmislite o spodnjem rezultatu:

Linux Sed filter

Kot lahko vidimo iz zgornjega rezultata, so vse 'rdeče' besede nadomeščene z 'modrimi', vse 'rumene' besede pa s 'črnimi'. Ukaze lahko ločimo tudi takole:

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

Rezultat bo enak zgornjemu ukazu.

Branje ukazov iz datoteke

Ukaze sed lahko shranimo v datoteko in jih takoj uporabimo v kateri koli datoteki. To lahko storite tako, da podate možnost '-f' na naslednji način:

 sed -f 

Iz zgornjega ukaza je '' datoteka, ki ima seznam ukazov sed. Razmislite o spodnjem ukazu:

 sed -f SedCommands exm.txt 

Zgornji ukaz bo uporabil vse navedene ukaze v datoteki 'SedCommand' na 'exm.txt'. Razmislite o spodnjem rezultatu:

Linux Sed filter

Iz zgornjega rezultata smo uporabili ukaze, uporabljene v prejšnjem primeru. Izhod je torej enak prejšnjemu primeru.

Zamenjava znakov

Za ločilo nizov lahko uporabimo klicaj (!). Na primer, želimo zamenjati lupino bash in jo zamenjati z lupino csh v '/etc/passwd'. Če želite to narediti, izvedite spodnji ukaz:

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

Enak rezultat lahko dosežemo z izvedbo spodnjega ukaza:

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

Omejitev sed

Osnovna uporaba ukaza sed obdela celotno datoteko. Lahko pa omejimo ukaz sed in podamo katero koli vrstico. Ukaz sed lahko omejite na dva načina:

if else stavek v Javi
  • Razpon vrstic.
  • Vzorec, ki se ujema z določeno črto.

Za določitev vrstice lahko zagotovimo številko, kot sledi:

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

Zgornji ukaz bo uporabil navedeno operacijo v tretji vrstici. Razmislite o spodnjem rezultatu:

Linux Sed filter

Iz zgornjega izhoda je spremenjena samo vrstica tri.

Določimo lahko tudi obseg vrstic. Če želite določiti obseg vrstic, izvedite ukaz na naslednji način:

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

Zgornji ukaz bo posodobil navedeno besedilo v vrsticah 1 in 3. Razmislite o spodnjem rezultatu:

Linux Sed filter

Vstavljanje in dodajanje besedila

Zastavici 'i' in 'a' se uporabljata za vstavljanje in dodajanje besedila v datoteko. Zastavica 'i' doda besedilo pred niz, zastavica 'a' pa se uporablja za dodajanje besedila za nizom. Razmislite o spodnjem ukazu:

 echo 'Another Demo' | sed 'iFirst Demo' 

Zgornji ukaz bo vstavil besedilo pred besedilo 'Še en demo'. Razmislite o spodnjem rezultatu:

Linux Sed filter

Če želite dodati besedilo, izvedite ukaz na naslednji način:

 echo 'Another Demo' | sed 'aFirst Demo' 

Zgornji ukaz bo dodal besedilo. Razmislite o spodnjem rezultatu:

Linux Sed filter

Spreminjanje vrstic

Zastavica 'c' se uporablja za spreminjanje določene vrstice. Če želite spremeniti vrstico, izvedite ukaz na naslednji način:

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

Zgornji ukaz bo posodobil tretjo vrstico. Razmislite o spodnjem rezultatu:

np.argmax
Linux Sed filter

Prav tako lahko uporabimo regularni izraz za posodobitev več kot ene vrstice z enakim vzorcem. Razmislite o spodnjem ukazu:

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

Zgornji ukaz bo posodobil vse vrstice z nizom 'Apple is'. Razmislite o spodnjem rezultatu:

Linux Sed filter

Transformacija likov

Zastavica 'y' se uporablja za preoblikovanje znakov. Preoblikovanje likov ne more biti omejeno na določene pojave. Za preoblikovanje znakov izvedite ukaz na naslednji način:

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

Zgornji ukaz bo spremenil znake 'a', 'b', 'c' v 'd', 'e', ​​'f'. upoštevajte spodnji rezultat:

Linux Sed filter

Tiskanje številk vrstic

Znak '=' se uporablja za izpis številke vrstice. Če želite natisniti številko vrstice, izvedite ukaz na naslednji način:

 sed '=' exm.txt 

Zgornji ukaz bo prikazal številko vrstice vsebine datoteke. Razmislite o spodnjem rezultatu:

Linux Sed filter

Znak enačaja z možnostjo '-n' določa številko vrstice, ki vsebuje ujemajoč se skript. Razmislite o spodnjem rezultatu:

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

Zgornji ukaz bo prikazal številko vrstice, ki vsebuje besedo 'mango'. Razmislite o spodnjem rezultatu:

Linux Sed filter

Iz zgornjega rezultata lahko vidimo, da ima vrstica številka 2 besedo 'mango'.