Učenje Linux naredbi: sed. Sed - Hey Linux Wiki Učenje Linux naredbi: sed

I ne mogu pronaći dobro napisane tutorijale.

Dopustite mi da kažem da sam radio s regularnim izrazom na drugim jezicima (Python, JavaScript, Java) tako da ovo ne bi trebalo biti problem.

Evo mojih pitanja (teoretskih i više praktičnih):

    Jesu li regularni izrazi korišteni u sed-u potpuno isti kao oni koje koristi Python/JS/Java? Čitao sam o BRE i ERE, ali koliko se razlikuju? Ne bi trebao biti proširenje BRE?

    ako želim, recimo, samo izdvojiti nešto iz izlazne cijevi, koja je sed sintaksa?

Pojedinosti o drugom pitanju: Recimo da imam produžetak rada sa sed-om:

Radno vrijeme | sed...

S obzirom na primjer izlaza iz vremena neprekidnog rada: 18:13 do 5:12, 2 korisnika, prosječno opterećenje: 0,45 0,37 0,40, želim raščlaniti jednokratno vrijeme rada kao dva odvojena broja (sati i minute), a zatim želim prikazati u obliku xxhyym (xx – sati, yy minute).

I za kraj, evo što bih napravio u Pythonu:

Hh, mm = re.match(r"\s+ up \s+(\d(1,2)):(\d(1,2))").groups() print "%sh%sm" % (hh , mm)

2 Rješenja prikupljaju obrazac web za “Regularne naredbe i naredbe sa sed naredbom”

Tradicionalni unix alati podržavaju BRE ili ERE (osnovne ili proširene regularne izraze). POSIX kodira oboje. Wikipedia ih objašnjava. Većina modernih alata proširuje ERE, često s dodatne funkcije, prvi put predstavljen u Perlu (koji je poznat kao PCRE).

ERE proširuje funkcionalnost BRE-a, ali ne proširuje sintaksu. U BRE, samo znakovi \[.*^$ imaju posebno značenje, a neki operatori, kao što je grupiranje \(…\) koriste obrnute kose crte. U ERE, +?|() su također posebni, a obrnuta kosa crta nakon koje slijedi nealfanumerički znak nikada nije posebna.

BRE nema Python/PCRE \d i \s . Ove skupove znakova možete izraziti korištenjem tradicionalnih skupova konstrukcija i klasa znakova: \d je [[:digit:]] i \s je [[:space:]] . Obratite pozornost na dvostruke zagrade: jedna za označavanje skupa znakova i jedna za označavanje klase znakova; na primjer, "slova, crtice ili podvlake" mogu biti napisane [-_[:alpha:]] .

BRE nema + operator (neke sed implementacije podržavaju \+ kao proširenje BRE sintakse); X+ je isto što i XX*. Grupe i podudaranja zahtijevaju dodatnu obrnutu kosu crtu.

Dakle, BRE ekvivalent Python-ovog \s+ up \s+(\d(1,2)):(\d(1,2)) je [[:space:]][[:space:]]* up [[: razmak:]][[:razmak:]]*\([[:znamenkasti:]]\(1,2\)\):\([[:znamenkasti:]]\(1,2\)\) . Imajte na umu da previše prolazite kroz: \s+ i razmak znače najmanje dva razmaka.

Morat ćete pronaći cijeli redak jer će naredba sed prepisati redak. Ne postoji posebna naredba za pisanje niza prikupljenih iz spremljenih grupa. Ispravljanje dodatnih razmaka, ekvivalent vašem Python isječku:

Radno vrijeme | sed "s/^.*[[:space:]][[:space:]]*up[[:space:]][[:space:]]*\([[:digit:]]\(1 ,2\)\):\([[:digit:]]\(1,2\)\).*$/\1h\2m/"

Za razliku od Python isječka, ovo dohvaća prvo podudaranje, a ne zadnje podudaranje, ali to ovdje nije važno.

Izlaz vremena neprekidnog rada sadrži znakove razmaka i ASCII znamenke, tako da možete pojednostaviti regularni izraz:

Radno vrijeme | sed "s/^.* gore *\(\(1,2\)\):\(\(1,2\)\).*$/\1h\2m/"

Ovo će odgovarati samo radnom vremenu vikenda ako je stroj bio mlađi od 1 dana. Odgovarajući broj dana ostavit ću kao vježbu. (Savjet: napišite dva izraza: sed -es/KAO GORE/\1h\2m/ -e "s/VJEŽBA/\1d\2h\3m/")

Svaki alat koristi (uglavnom) vlastitu RE biblioteku. Čak i među različite verzije ovdje ćete pronaći razlike. Dva popularna standarda - standardni regular POSIX izrazi, od kojih ih mnogi prihvaćaju (s barem nekim opcijama), još jedan popularan skup je Perl Compatible Regular Expression (PCRE) biblioteka. Ali potonji se malo razlikuju od "vanilije" RE...

Vaš slučaj:

Radno vrijeme | sed -e "s/^ \(\):\(\).*$/\1h\2m/"

(Isprobano na Fedori 18, sed-4.2.1-10.fc18.x86_64, GNU sed).

Ažuriraj:što nije u redu s velikom dokumentacijom o početna stranica GNU sed? Ili ovaj tutorial? Bijeli papir za GNU sed je malo dugačak, ali potpun.

Uređivač sed streama je neinteraktivni uređivač teksta koji izvodi operacije na podacima koji dolaze iz standardnog unosa ili iz datoteke. Sed uređuje informacije redak po redak.

Opisane su osnove rada sa sed editorom. Ovaj priručnik pokriva naprednije tehnike.

Spajanje timova

Ponekad postaje potrebno proslijediti nekoliko naredbi sed editoru u isto vrijeme. To se radi na nekoliko načina.

Ako već nemate testnu datoteku za rad sa sed-om, stvorite sljedeće okruženje:

CD
cp /usr/share/common-licenses/BSD .
cp /usr/share/common-licenses/GPL-3 .
echo "ovo je pjesma koja nikad ne završava


ne znajući što je to

samo zato što..." > dosadno.txt

Budući da sed radi na standardnom ulazu i izlazu, možete naravno pozvati razne sed naredbe zajedno u istom retku:

sed "s/i/\&/" neugodno.txt | sed "s/ljudi/konji/"

da, nastavlja se i nastavlja, prijatelju
neki su je konji počeli pjevati
ne znajući što je to
i nastavit će to pjevati zauvijek
samo zato što...

Ova će metoda funkcionirati, ali višestruki pozivi sed-u stvaraju opterećenje, zauzimaju više prostora i ne iskorištavaju prednosti ugrađenih mogućnosti sed-a.

Možete poslati više naredbi sed-u u isto vrijeme koristeći opciju –e, koja se mora umetnuti prije svake naredbe:

sed -e "s/i/\&/" -e "s/ljudi/konji/" neugodno.txt

Također možete spojiti naredbe u niz koristeći znak točka-zarez. Ova metoda radi potpuno isto kao i prethodna.

sed "s/i/\&/;s/ljudi/konji/" neugodno.txt

Imajte na umu da korištenje zastavice -e zahtijeva razbijanje jednostrukih navodnika, ali korištenje točke-zareza omogućuje da sve naredbe budu navedene unutar jednostrukih navodnika.

Ove dvije metode pozivanja više naredbi odjednom su prilično prikladne, ali postoje slučajevi kada trebate koristiti jednostavan naredbeni redak.

Također biste trebali biti upoznati s operatorom =. Ova izjava umeće broj retka između svakog postojećeg retka. Rezultat izgleda ovako:

sed "=" neugodno.txt
1
ovo je pjesma koja nikad ne prestaje
2
da, to traje i traje, prijatelju
3
neki ljudi su to počeli pjevati
4
ne znajući što je to
5
i nastavit će je pjevati zauvijek
6
samo zato što...

Sada pokušajte urediti tekst da biste razumjeli kako se mijenja format numeriranja.

Naredba G prema zadanim postavkama dodaje prazan redak između postojećih redaka.

sed "G" neugodno.txt
_
ovo je pjesma koja nikad ne prestaje
_
da, to traje i traje, prijatelju
_
neki ljudi su to počeli pjevati
_
ne znajući što je to
_
i nastavit će je pjevati zauvijek
_
samo zato što...

Pokušajte kombinirati ove dvije naredbe. Isprva se može činiti da će izlaz ovih naredbi sadržavati prazan redak između retka teksta i retka s brojem. Međutim, rezultat izgleda ovako:

sed "=;G" neugodno.txt
1
ovo je pjesma koja nikad ne prestaje
_
2
da, to traje i traje, prijatelju
_
3
neki ljudi su to počeli pjevati
_
4
ne znajući što je to
. . .
. . .

To se događa jer operator = modificira izlazni tok (što znači da se rezultirajući izlaz ne može koristiti za daljnje uređivanje).

To se može prevladati korištenjem dvaju poziva sed-u, pri čemu će se prvi poziv tretirati kao jednostavan tok teksta drugom.

sed "=" neugodno.txt | znak "G"
1
_
ovo je pjesma koja nikad ne prestaje
_
2
_
da, to traje i traje, prijatelju
_
3
_
neki ljudi su to počeli pjevati
. . .
. . .

Imajte na umu da neke od naredbi rade na sličan način, osobito ako kombinirate više naredbi, a izlaz je drugačiji od očekivanog.

Napredno adresiranje

Jedna prednost sed-ovih naredbi koje su svjesne adresiranja je ta da mogu koristiti regularne izraze kao kriterije. To znači da možete raditi s datotekama čiji sadržaj nije točno poznat.

sed "1,3s/.*/Hello/" annoying.txt
zdravo
zdravo
zdravo
ne znajući što je to
i nastavit će je pjevati zauvijek
samo zato što...

Umjesto toga, možete koristiti regularni izraz koji odgovara samo retcima koji sadrže određeni uzorak. Da biste to učinili, morate postaviti uzorak pretraživanja između dvije kose crte (/) prije naredbe.

sed "/pjevanje/s/to/& glasno/" neugodno.txt
ovo je pjesma koja nikad ne prestaje
da, to traje i traje, prijatelju
neki ljudi su to počeli glasno pjevati
ne znajući što je to
i nastavit će to glasno pjevati zauvijek
samo zato što...

Ovaj primjer postavlja riječ loudly ispred prvog it u svakom retku koji sadrži riječ singing. Imajte na umu da su drugi i četvrti redak ostavljeni nepromijenjeni jer ne odgovaraju uzorku.

Izrazi adresiranja mogu biti složeniji. To timove čini fleksibilnijima.

Sljedeći primjer pokazuje kako koristiti regularne izraze za generiranje adresa za druge naredbe. Ova naredba pronalazi sve prazne linije i uklanja ih:

sed "/^$/d" GPL-3
GNU OPĆA JAVNA LICENCA
Verzija 3, 29. lipnja 2007
Autorska prava (C) 2007 Free Software Foundation, Inc.
Svima je dopušteno kopirati i distribuirati doslovne kopije
ovog licencnog dokumenta, ali nije dopušteno njegovo mijenjanje.
Preambula
GNU Opća javna licenca je besplatna, copyleft licenca za
. . .
. . .

Imajte na umu da se regularni izrazi mogu koristiti bilo gdje u rasponu.

Na primjer, možete ukloniti linije između START i END linije:

sed "/^START$/,/^END$/d" ulazna datoteka

Imajte na umu da će ova naredba izbrisati sve retke od prve pronađene riječi START do prve pronađene riječi END, a ako zatim ponovno naiđe na riječ START, nastavit će brisati podatke.

Za obrnuto adresiranje (to jest, odabir redaka koji ne odgovaraju uzorku), upotrijebite uskličnik (!).

Na primjer, da biste izbrisali bilo koju ispunjenu liniju, morate unijeti:

sed "/^$/!d" GPL-3

Adresa ne mora biti složen izraz da bi bila invertirana. Inverzija radi na isti način s uobičajenim numeriranjem.

Korištenje dodatnog međuspremnika

Dodatni međuspremnik zadržavanja povećava mogućnost sed-a za izvođenje uređivanja u više redaka.

Dodatni međuspremnik je privremeno područje za pohranu koje se može mijenjati određenim naredbama.

Posjedovanje ovog dodatnog međuspremnika omogućuje vam pohranjivanje nizova dok radite na drugim nizovima.

Naredbe za rad s međuspremnikom:

  • h: Kopira trenutni međuspremnik obrade (posljednji odgovarajući redak na kojem radite) u dodatni međuspremnik.
  • H: Dodaje trenutni međuspremnik obrade na kraj trenutnog dodatna obrada, odvajajući ih znakom \n.
  • g: Kopira trenutni podspremnik u trenutni međuspremnik za obradu. Prethodni međuspremnik obrade bit će izgubljen.
  • G: Dodaje trenutni predložak trenutnom međuspremniku za obradu, odvajajući ih znakom \n.
  • x: Mijenja trenutni predložak i dodatni međuspremnik.

Sadržaj dodatnog međuspremnika ne može se obraditi dok se ne premjesti u međuspremnik za obradu.

Pogledajmo složeni primjer.

Pokušajte spojiti susjedne retke pomoću sljedeće naredbe:

sed -n "1~2h;2~2(H;g;s/\n/ /;p)" neugodno.txt


Bilješka: Zapravo, sed nudi zasebnu ugrađenu N naredbu za ovo; ali za praksu je korisno razmotriti ovaj primjer.

Opcija –n potiskuje automatski izlaz.

1~2h – definicija adrese, izvođenje sekvencijalne zamjene svakog drugog retka teksta, počevši od prvog (tj. svakog neparnog retka). Naredba h kopira podudarne retke u dodatni međuspremnik.

Ostatak tima je primljen naramenice. To znači da će ovaj dio naredbe naslijediti adresu koja je upravo navedena. Bez ovih zagrada, samo će naredba H naslijediti adresu, a ostale naredbe će se izvršavati na osnovi retka.

Naravno, prethodno spomenuta N ugrađena je mnogo kraća i jednostavnija, i vraća isti rezultat:

sed -n "N;s/\n/ /p" neugodno.txt
ovo je pjesma koja nikad ne završava, da, nastavlja se i nastavlja, prijatelju
neki ljudi su to počeli pjevati ne znajući što je to
i nastavit će je pjevati zauvijek samo zato što...

sed skripte

Naredbe se mogu prevesti u skripte. To vam omogućuje izvršavanje čitavog skupa naredbi na jednom ciljnom predlošku.

Na primjer, možete napisati skriptu za stvaranje jednostavnih tekstualnih poruka koje je potrebno unaprijed formatirati.

Tada nećete morati stalno ponavljati iste naredbe za svaku poruku. U biti, sed skripta je popis naredbi koje je potrebno primijeniti na dati objekt.

Na primjer:

s/ovo/ono/g
s/snijeg/kiša/g
1,5 s/borove šišarke/marelice/g

Zatim možete nazvati datoteku:

sed -f sedScriptName fileToEdit

Zaključak

Sada znate naprednije tehnike za rad sa sed-om.

U početku je sed naredbe teško razumjeti i lako vas je zbuniti. Stoga se preporuča eksperimentirati s njima prije njihove upotrebe na važnim podacima.

Oznake: ,

Korisnost sed je moćan uređivač teksta za strujanje s podrškom za regularne izraze. Pomoću sed možete zamijeniti tekstualne predloške (i izravno u datoteci!), brisati retke (elemente niza), ispisati retke koji odgovaraju maski (slično grep). Urednik sed podržava korištenje višestrukih naredbi i proširenu sintaksu regularnog izraza (koja ne zahtijeva izbjegavanje posebnih znakova).

sed ne podržava provjere unaprijed i unatrag u regularnom izrazu! Za zamjenu pomoću sintakse proširenog regularnog izraza koristite:

Pažnja!

Prilično je problematično raditi sa znakom novog retka! Najprikladnije rješenje je:

Možete koristiti bilo koje simbole kao graničnike (na primjer: ,). Podudaranje dijelovi (koji su unutar zagrada) dostupni su kao, .

Mogućnosti uslužnih programa:

Oznake naredbenog retka (označite na kraju maske):

Primjeri

Filtriranje redaka

Ispiši retke 1-5:

Izlazne datoteke koje odgovaraju maski:

Redovi duži od 80 znakova:

Zamjena predloškom

Ispis pojavljivanja ( šibice) putem tablice:

Zamijeni nazive datoteka ( kompozitor na skladatelj-dev):

Zamijenite znakove (regex):

Zamijeni URL u datoteci (stvar u razdjelnicima i za zamjenu u datoteci):

Zamijenite parametar u konfiguraciji:

Uklonite vodeće razmake (slično ltrim):

Uklanjanje redaka

Uklonite liniju koja odgovara uzorku iz datoteke:

Ukloni prvi redak izlaza:

Izbrišite retke od prvog do odgovarajućeg regularni izraz:

Zamijeni podniz:

Bilješka

Prema zadanim postavkama, svi posebni elementi moraju biti izbjegnuti. znakova u regularnim izrazima, što izuzetno otežava čitanje maski. Kako biste izbjegli posebne znakove samo ako su opisani u tekstu, omogućite napredni način rada regularni izraz izrazi pomoću opcije.

Ukloni prazne retke:

Ukloni zadnja N=2 znaka:

Ekstrakcija podniza

Izrežite / zapamtite zadnja N=4 znaka:

#sed, #regexp, #bash

Učenje Linux naredbi: sed

Streaming SED editor

Sed je lagan (binarni sadržaj teži samo 128 kilobajta) i praktičan alat za obradu teksta.

U ovom ću članku dati nekoliko jednostavni primjeri koristiti sed i reći vam o njegovim glavnim mogućnostima.

Sed uzima ulazni tok ili datoteku redak po redak, uređuje svaki redak prema pravilima definiranim u sed skripti, a zatim ispisuje rezultat. Sed je Turingov kompletan programski jezik.

format naredbe sed

Naredba sed ima format:

sed [ -n ] [ -e skripta ] [ -f datoteka skripte ] [ datoteke ]

Zastava -n potiskuje izlaz
-e- ukazuje na popis uputa navedenih u naredbeni redak.
-f- označava mjesto datoteke skripte.

Uredi format naredbe

Datoteka skripte sastoji se od skupa naredbi:

[ adresa [ , adresa ] ] naredba [ argumenti ]

po jedan na svakoj liniji.
Adrese su ili brojevi linija ili Posebni simboli, ili regularni izraz:

$ - zadnji redak
početak~N- Svaki N-ti red počevši od broja Početak
/regularni izraz/- linije koje potpadaju pod regularni_izraz
Primjeri:

1~2 - Svaki drugi red /REGEXP/- sve retke u kojima se pojavljuje /REGEXP/ 10,20 - linije od 10 do 20 10,+10 - linije od 10 do 20 5,~N- linije počevši od 5. pa do prvog višekratnika N 5,/REGEXP/- linije koje sadrže /REGEXP/, nakon 5. (ne uključujući 5.)
  • Ako nije navedena adresa, obrađuju se sve linije.
  • Ako je navedena jedna adresa, obrađuje se odgovarajuća linija
  • Ako su navedene dvije adrese, odabiru se linije u navedenom intervalu.
  • !tim- izvedena tim, za retke koji nisu odabrani prema adresi.

Osnovne naredbe

Pogledajmo osnovne naredbe:

[adresa] tekst- dodajte novi redak s tekstom nakon navedenog retka

[adresa [, adresa]] c tekst- Uklanja odabrane retke i zamjenjuje ih s tekst

[adresa [, adresa]] d- Briše navedene retke.

[adresa] i tekst- Umetni tekst umjesto navedenog retka.

[adresa [, adresa]] str(sa zastavom -n) prikazuje pronađene linije.

[adresa]q- izlaz iz sed.

[adresa [, adresa]] r datoteka- Čita datoteka i ispisuje njegov sadržaj.

[adresa [, adresa]] s/regex/replacement/flags- Zamjenjuje regularni izraz na zamjena- uzimajući u obzir zastave:

  • g - u cijeloj liniji
  • i - neosjetljivo na velika i mala slova
  • p - prikaz rezultata zamjene

[adresa [, adresa]] y/line1/line2/- Zamjenjuje sva pojavljivanja znakova u linija 1 odgovarajući simboli iz linije2.

Duljine linija moraju biti iste.

[adresa[,adresa]] (naredbe)- grupne naredbe u zagradama
[adresa] =- Daje brojeve redaka

Oznake

: oznaka- odgovara grupi naredbi označiti
b oznaka označiti, Ako označiti nedostaje, zatim idite na kraj naredbene datoteke.

t oznaka- idite na naredbu naznačenu oznakom označiti tek nakon uspješne zamjene pomoću naredbe s///

Izvršna petlja

sed radi s dva međuspremnika podataka: glavnim i pomoćnim. U početku su oba međuspremnika prazna.
Rad s ovim međuspremnicima odvija se pomoću naredbi:\\`h’, `H’, `x’, `g’, `G’ `D’ h- Zamijenite sadržaj pomoćnog međuspremnika sadržajem glavnog
H- Dodajte novi redak u pomoćni međuspremnik, a zatim dodajte sadržaj glavnog međuspremnika sadržaju pomoćnog
x- Zamijenite sadržaj oba međuspremnika
g- Zamijenite sadržaj glavnog međuspremnika sadržajem pomoćnog
G- Dodajte novi red u glavni međuspremnik i zatim dodajte sadržaj pomoćnog međuspremnika sadržaju glavnog
D- Brisanje teksta glavnog međuspremnika do sljedećeg znaka novog retka
N- Dodajte novi red u glavni međuspremnik, zatim dodajte sljedeći redak koji će se ondje obraditi
P- Ispis sadržaja glavnog međuspremnika do sljedećeg znaka novog retka.

Složeniji primjeri

Sljedeća skripta mijenja redove datoteke (prvi redovi postaju posljednji i obrnuto)

Brojimo retke datoteke (prikazujemo broj posljednjeg retka)

proizlaziti

Preokret niza

Ova skripta pomiče dva slova odjednom.

dodatne informacije

Možete saznati više o formatu sed skripti čitanjem priručnika čovjek sed ili tehničke dokumentacije info sed.

Povratak na sadržaj

02.02.2013

Proširenje niza koristeći Bash u primjerima (proširenja parametara)

(Korišteni materijali [ 1] [ 2] i [ 3])

Za rad s nizovima koristeći Bash, koristite parametre proširenja ( proširenja parametara) Opis ovog principa može se naći u paragrafu.
Opis je pomalo teško razumjeti. Puno je lakše razumjeti princip rada s primjerima.

1. Uklanjanje znakova na početku ili kraju retka

Bilo koji pojedinačni znak označava se kao

Postavimo varijablu

$ STRING=aabbcc $ echo $(STRING) aabbcc Za uklanjanje znakova na početku retka koristite naredbe: $ echo $(STRING#?) abbcc $ echo $(STRING#???) bcc za uklanjanje znakova na kraj retka: $ echo $ (STRING%?) aabbc $ echo $(STRING%???) aab Da zapamtite kada koristiti znak, a kada ovu izvornu metodu:
Znakovi su poredani redom na tipkovnici i:
- lijevo od, znači od početka retka
- desno od, znači do kraja retka

2. Uklanjanje regularnih izraza na početku ili kraju retka

Regularni izrazi (ili RegExp, regex) niz su predloška ili "maska" koja navodi pravilo pretraživanja.

Ponovno postavimo varijablu

$ STRING=GNULinux $ echo $(STRING) GNULinux uklanja regularni izraz na početku retka: $ echo $(STRING#GNU) Linux uklanja regularni izraz na kraju retka: $ echo $(STRING%Linux) GNU Sada ista stvar, ali koristeći " *" (zvjezdica)
uklonite regularni izraz na početku retka (): $ echo $(STRING#*U) Linux uklonite regularni izraz na kraju retka (): $ echo $(STRING%L*) GNU

Korištenje regularni izrazi može se kombinirati s "?" (znak bilo kojeg simbola) ():

$ echo $(STRING%??n*) GNU

3. Korištenje dvostrukog ## i %%

Ako pri brisanju iz retka regularni izrazi(*regex ili regex*), kada koristite “#” i “%” sa “*” - brisanje se događa prije prvog pojavljivanja regularni izraz, zatim kada koristite dvostruke “##” i “%%” - do zadnjeg:

I ponovno postavimo varijablu

$ STRING=abcdcba $ echo $(STRING) abcdcba STRING=abcdcba $(STRING#*c) dcba$(STRING##*c) ba$(STRING%c*) abcd$(STRING%%c*) ab$ echo $(STRING#*c) dcba $ echo $(STRING##*c) ba $ echo $(STRING%c*) abcd $ echo $(STRING%%c*) ab

4.

Varalica za sed

Traži i zamijeni

Zamjena prvog pojavljivanja

Globalna zamjena

$ STRING="abrakadabra" $ echo "$(STRING/a/O)" Obrakadabra $ echo "$(STRING//a/O)" ObrOcOdObrO $ echo "$(STRING/#a/O)" Obrakadabra $ echo " $(STRING/%a/O)" abracadabrO $ echo "$(STRING/a/)" bracadabra $ echo "$(STRING//a/)" brcdbr

5. Izdvajanje podniza korištenjem pomaka i duljine

Pomak od ruba linije

Duljina podniza

5.1 Pristranost za pozitivne vrijednosti

Za pozitivne vrijednosti pomaka, prvi znak retka odgovara vrijednosti "".

Primjeri s pozitivnim vrijednostima: $ STRING="Debian Gentoo RedHat" $ echo $(STRING:0:6) Debian $ echo $(STRING:14) RedHat $ echo $(STRING:7:6) Gentoo
5.2 Pomak za negativne vrijednosti

Za negativne vrijednosti, brojanje se provodi od kraja retka, a posljednji znak retka odgovara vrijednosti jednakoj "".

Da biste napisali negativni pomak između dvotočke i znaka minus, morate ostaviti razmak ili staviti negativnu vrijednost u zagradu.

Ako nije navedeno, duljina podniza automatski se produžuje do kraja.

Primjeri s negativnim vrijednostima: $ STRING="Debian Gentoo RedHat" $ echo $(STRING: -6) RedHat $ echo $(STRING:(-6)) RedHat $ echo $(STRING:(-6):3) Red $ echo $(STRING:(-6):10) # duljina premašuje RedHat pomak
5.3 Negativne vrijednosti.

Ako ima negativnu vrijednost, tada se ponaša kao pomak od kraja niza. Rezultat će biti podniz između prvog i drugog pomaka:

$ STRING="Debian Gentoo RedHat" $ echo $(STRING:7:-7) Gentoo $ echo $(STRING:(-14):-7) Gentoo

Kako sve ovo provesti u praksi:

Ispod su različite opcije koda za promjenu ekstenzije iz u prilikom skupnog transkodiranja audio datoteka: for i u *.wav; do lame "$i" "$(i%???)mp3"; učinjeno; za i u *.wav; radi lame "$i" "$(i%wav)mp3"; učinjeno; za i u *.wav; do lame "$i" "$(i%.*).mp3"; učinjeno; za i u *.wav; učiniti lame "$i" "$(i/wav/mp3)"; učinjeno; za i u *.wav; napravi lame "$i" "$(i:0:-3)mp3"; učinjeno;

6. Brojanje broja znakova u retku

$ STRING="Izbrojite broj znakova u nizu" $ echo $(#STRING) 36
Saznajte broj znakova u datoteci: $ ARRAY=(`cat file.html`) $ echo $(#ARRAY[@]) 1158

Ovdje treba napomenuti da se datoteka ne čita samo u varijablu, već u niz, jer se sastoji od nekoliko redaka. Dakle, za točan izračun potrebno je kladiti se. Ako se to ne učini, naredba će pročitati samo prvi red iz datoteke:

$ ARRAY=(`cat file.html`) $ echo $(#ARRAY) 7 Doista, prvi red sadrži samo oznaku i Windows znak za novi red () - a to je 7 znakova.

7. Mijenjanje velikih i malih slova znakova

Pretvara prvi znak u veliko slovo

Pretvara sve znakove u velika slova

Pretvara prvi znak u mala slova

Pretvara sve znakove u mala slova

Obrće velika i velika slova prvog znaka

Obrće velika i velika slova svih znakova

Oznake: Linux, bash, shell, regularni izrazi, proširenja parametara, RegExp, regex, duljina, pomak, for, in, do. lame, done, *.wav, mp3, CR+LF, regularni izrazi, uzorak, pretraživanje, varijabla, niz, niz, znakovi, velika, mala, velika i mala slova

Uvod

Naredba sed je Stream Editor za automatsko uređivanje teksta. "Stream editor" - u smislu da može kontinuirano uređivati ​​dolazni tok podataka, recimo kao dio programskog kanala (pipe). Automatski - to znači da čim postavite pravila za uređivanje, ostalo se događa bez vašeg dosadnog sudjelovanja. Drugim riječima, sed editor nije interaktivan.

Program sed složeniji je od naredbi o kojima smo već govorili u prethodnim člancima serije HumanMan. Uključuje arsenal vlastitih naredbi, stoga, kako bi se izbjegla tautologija i zabuna, u ovom članku naredba sed od sada će se zvati "program" ili "uređivač", a naredbe uređivača sed jednostavno će se zvati naredbe.

Program sed može obavljati složene zadatke i potrebno je vrijeme da naučite kako formulirati te zadatke.

Ali zajedno s složene akcije, naredba sed ima jednostavne, ali vrlo korisne značajke koje nije ništa teže svladati od drugih Unix naredbi. Ne dopustite da vas složenost svladavanja cijelog programa natjera na izbjegavanje jednostavnijih aspekata.

Počet ćemo od jednostavnog prema složenom, tako da uvijek možete smisliti gdje stati.

Naredba s - supstitucija (zamjena)

Program sed ima mnogo vlastitih naredbi. Većina korisnika zna samo naredbu s, a to je dovoljno za rad sa sed editorom. Naredba s zamjenjuje PATTERN sa REPLACE:

sed s/UZORAK/ZAMJENA/

$ dan odjeka | sed s/dan/noć/ (Ući) noć

Ne može biti jednostavnije. Evo primjera s unosom iz datoteke zar.txt:

Ujutro je radio vježbe. Munja je električni naboj. $ sed s/charge/discharge/ zar.txt Ujutro je radio pražnjenje. Munja je električno pražnjenje.

Izraz s/UZORAK/ZAMIJENI/ nisam stavio pod navodnike jer ovaj primjer ne treba navodnike, ali ako sadrži metakaraktere, onda bi navodnici bili potrebni. Kako ne biste svaki put razbijali glavu, i ne biste slučajno pogriješili, uvijek stavljajte navodnike, po mogućnosti one “jače” jednostruke, ovo je dobra navika. Kašu ne možete pokvariti uljem. Ni ja neću štedjeti na navodnicima u svim sljedećim primjerima.

Kao što vidimo, naredba zamjene s ima četiri komponente:

S sama naredba /.../.../ separator PATTERN obrazac za traženje i naknadnu zamjenu REPLACE izraz koji će zamijeniti PATTERN ako se pronađe.

Kosa crta (/) tradicionalno se koristi kao razdjelnik, jer ih koristi predak sed-a, ed editor (kao i vi editor). U nekim je slučajevima takav razdjelnik vrlo nezgodan, na primjer, kada trebate promijeniti staze do direktorija koji također sadrže kosu crtu (/usr/local/bin). U ovom slučaju morate razdvojiti kose crte naprijed s kosim crtama unazad:

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

To se zove "ograda" i izgleda vrlo ružno, i što je najvažnije, neshvatljivo.

Ono što je jedinstveno kod sed-a je da vam omogućuje korištenje bilo kojeg graničnika, kao što je podvlaka:

$ dan odjeka | sed s_dan_noć_ noć

ili dvotočka:

$ dan odjeka | sed s:dan:noć:noć

Ako dok tražite razdjelnik koji vam se sviđa, dobijete poruku "incomplete `s command", onda ovaj znak nije dobar razdjelnik ili ste jednostavno zaboravili staviti razdjelnik ili dva.

U ovom članku moram koristiti tradicionalni razdjelnik (/) kako bih izbjegao zbunjivanje čitatelja, ali ako je potrebno, upotrijebit ću tildu (~) kao razdjelnik.

Regularni izrazi (RE)

(regularni izrazi, regexp, RE)

Tema regularnih izraza toliko je opsežna da su joj posvećene cijele knjige (pogledajte poveznice na kraju članka). Međutim, ozbiljno govoriti o sed uređivaču bez korištenja regularnih izraza jednako je kontraproduktivno kao govoriti o trigonometriji pomoću dodavanja štapića. Stoga je potrebno govoriti barem o onim regularnim izrazima koji se često koriste uz sed program.

S Ili bilo koje drugo pismo. Većina slova, brojeva i drugih nespecijalnih znakova smatraju se regularnim izrazima koji predstavljaju sami sebe.

* Zvjezdica iza bilo kojeg simbola ili regularnog izraza znači bilo koji broj (uključujući nulu) ponavljanja tog simbola ili regularnog izraza.

\+ Označava jedno ili više ponavljanja znaka ili regularnog izraza.

\? Znači ništa ili jedno ponavljanje.

\(i\) Znači točno i ponavljanja.

\(i J\) Broj ponavljanja je u rasponu od i do j uključivo.

\(i,\) Broj ponavljanja je veći ili jednak i.

\(,j\) Broj ponavljanja je manji ili jednak j.

\(PONOVNO\) Zapamtite regularni izraz ili njegov dio za buduću upotrebu u cjelini. Na primjer, \(a-z\)* tražit će bilo koju kombinaciju bilo kojeg broja (uključujući nulu) malih slova.

. Odgovara bilo kojem znaku, uključujući novi red.

^ Označava nulti izraz na početku retka. Drugim riječima, ono čemu prethodi ovaj znak mora se pojaviti na početku retka. Na primjer, ^#include tražit će retke koji počinju s #include.

$ Isto kao i prethodni, samo se odnosi na kraj retka.

[POPIS] Označava bilo koji znak s POPISA. Na primjer, tražit će bilo koje slovo engleskog samoglasnika.

[^LIST] Označava bilo koji znak osim onih na popisu. Na primjer, [^aeiou] tražit će bilo koji suglasnik. Napomena: LIST može biti interval, na primjer [a-z], što će značiti bilo koje malo slovo. Ako trebate uključiti ] (uglastu zagradu) na POPIS, označite ga prvi na popisu; ako trebate uključiti - (crticu) u POPIS, tada ga označite prvim ili zadnjim na popisu.

RE1\|RE2 Znači PB1 ili PB2.

RE1RE2 Označava uniju regularnih izraza RV1 i RV2.

\n Označava znak novog retka.

\$; \*; \.; \[; \\; \^ Znači prema tome: $; *; .; [; \; ^

Pažnja: Odmor simboli na temelju obrnute kose crte (\), usvojene u jeziku C, nisu podržane od strane sed programa.

\1 \2 \3 \4 \5 \6 \7 \8 \9 Označava odgovarajući dio regularnog izraza, pohranjen pomoću znakova \(i \).

Nekoliko primjera:

a B C D E F Znači abcdef

a*b Predstavlja nulu ili bilo koji broj a i jedan b. Na primjer, aaaaaab; ab; ili b.

a\?b Znači b ili ab

a\+b\+ Znači jedan ili više slova a i jedno ili više b-ova. Na primjer: ab; aaaab; abbbbb; ili aaaaaabbbbbbb.

.* Označava sve znakove u retku, u svim recima, uključujući prazne.

.\+ Odgovara svim znakovima u retku, ali samo u recima koji sadrže barem jedan znak. Prazni nizovi ne odgovaraju ovom regularnom izrazu.

^glavno.*(.*) Tražit će retke koji počinju s riječju main, a također sadrže otvarajuće i zatvarajuće zagrade, a prije i iza otvarajuće zagrade može biti bilo koji broj znakova (ili ih ne mora biti).

^# Tražit će retke koji počinju znakom # (npr. komentare).

\\$ Tražit će retke koji završavaju obrnutom kosom crtom (\).

Bilo koja slova ili brojke

[^ ]\+ (Uglata zagrada, uz znak ^, također sadrži razmak i tabulator) -- Označava jedan ili bilo koji broj bilo kojih znakova, osim razmaka i tabulator. Obično to znači riječ.

^.*A.*$ Sredstva veliko slovo I to točno na sredini reda.

A.\(9\)$ Označava veliko slovo A, točno deseto slovo od kraja retka.

^.\(,15\)A Označava veliko slovo A, točno šesnaesto od početka retka.

Sada kada smo vidjeli neke regularne izraze, vratimo se naredbi s u sed-u.

Upotrebom simbola & kada je UZORAK nepoznat "Kako je nepoznat?", pitate: "Zar ne znate što želite zamijeniti?" Odgovorit ću: Želim staviti u zagrade sve brojeve koji se nalaze u tekstu. Kako to učiniti? Odgovor: koristite simbol &.

Simbol & (ampersand), kada se nalazi kao dio ZAMJENE, znači bilo koji OBRAZAC koji se nalazi u tekstu. Na primjer:

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

Zvjezdica (zvjezdica) nakon intervala je potrebna kako bi se svi brojevi pronađeni u uzorku zamijenili. Bez toga bi bilo:

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

Odnosno, prva pronađena znamenka uzeta je kao uzorak.

Evo primjera s potpuno smislenim opterećenjem: stvorimo datoteku formula.txt:

A+432-10=n

i na njega primijenite naredbu:

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

Matematička formula dobila je nedvosmisleno značenje.

Drugi simbol ampersand može se koristiti za udvostručenje UZORAKA:

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

Ovdje postoji jedna suptilnost. Ako malo zakompliciramo primjer:

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

kao što biste i očekivali, samo su brojevi udvostručeni budući da u UZORCU nema slova. Ali ako zamijenimo dijelove teksta:

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

tada nikakvo udvostručenje brojeva neće uspjeti. Ovo je značajka regularnog izraza * - odgovara samo prvom znaku niza. Ako želimo udvostručiti znamenke gdje god bile, trebamo modificirati regularni izraz u REPLACE:

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

tada će se brojevi udvostručiti, bez obzira na broj prethodnih “riječi”.

Korištenje izbjegnutih zagrada \(, \) i \1 za obradu dijela UZORCA Izbjegnute zagrade \(i \) koriste se za pohranjivanje dijela regularnog izraza.

Simbol \1 označava prvi zapamćeni dio, \2 drugi, i tako dalje, do devet zapamćenih dijelova (program ne podržava više). Pogledajmo primjer:

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

Ovdje \(*\) znači da program mora zapamtiti sve abecedne znakove u bilo kojoj količini; .* znači bilo koji broj znakova nakon prvog zapamćenog dijela; a \1 znači da želimo vidjeti samo prvi dio zapamćen. Tako je: u izlazu programa vidimo samo slova, a ne brojeve.

Da biste zamijenili riječi, morate zapamtiti dva pod-UZORAKA, a zatim ih zamijeniti:

$ echo glupi pingvin |sed "s/\([a-z]*\) \([a-z]*\)/\2 \1/" glupi pingvin

Ovdje \2 znači drugi pod-UZORAK, a \1 znači prvi. Obratite pažnju na razmak između prvog izraza \([a-z]*\) i drugog izraza \([a-z]*\). Potrebno je pronaći dvije riječi.

Znak \1 ne mora biti prisutan samo u ZAMJENI; može biti prisutan i u UZORKU, na primjer, kada želimo ukloniti duple riječi:

$ jeka pingvin pingvin | sed "s/\([a-z]*\) \1/\1/" pingvin

Modifikatori zamjene naredbi s

Zamjenski modifikatori postavljaju se iza posljednjeg graničnika. Ovi modifikatori određuju što će program učiniti ako postoji više od jednog podudaranja s PATTERN-om u nizu i kako izvršiti zamjenu.

Modifikator /g

Globalna zamjena

Program sed, kao i većina Unix uslužnih programa, čita red po red kada radi s datotekama. Ako naredimo zamjenu riječi, program će zamijeniti samo prvu riječ koja odgovara UZORCU u zadanom retku. Ako želimo promijeniti svaku riječ koja odgovara uzorku, tada bismo trebali unijeti modifikator /g.

Bez modifikatora /g:

$ echo ova mačka je bila najobičnija mačka | sed "s/cat/kitten/" ovaj mačić je bio najobičnija mačka

Urednik je zamijenio samo prvu riječ koja je odgovarala.

A sada s globalnim modifikatorom zamjene:

$ echo ova mačka je bila najobičnija mačka | sed "s/cat/kitten/g" ovaj mačić je bio najobičniji mačić

Sva podudaranja u ovom nizu su zamijenjena.

A ako trebate promijeniti sve riječi, recimo, stavite ih u zagrade? Tada će regularni izrazi opet doći u pomoć. Za odabir svih abecednih znakova, i velikih i malih slova, možete koristiti konstrukciju [A-Ya-Ya], ali ona neće uključivati ​​riječi poput "nešto" ili "s"ezd. Konstrukcija [^] je mnogo više zgodno ]*, što odgovara svim znakovima osim razmaka.

$ jeka glupi pingvin plaho se skriva | sed "s/[^ ]*/(&)/g" (glup) (pingvin) (plašljiv) (skriva se)

Kako odabrati pravu utakmicu između nekoliko

Ako ne primijenite modifikatore, sed program će zamijeniti samo prvu riječ koja odgovara UZORCU. Ako primijenite /g modifikator, program će zamijeniti svaku podudarnu riječ. Kako možete odabrati jedan od rezultata ako ih je nekoliko na liniji? - Koristeći konvencionalne simbole \(i \) s kojima smo već upoznati, zapamtite podUZORKE i odaberite onaj koji vam je potreban pomoću simbola \1 - \9.

$ jeka glupi pingvin | sed "s/\([a-z]*\) \([a-z]*\)/\2 /" pingvin

U ovom smo primjeru zapamtili obje riječi i, stavljajući drugu (pingvin) na prvo mjesto, uklonili smo prvu (glup) stavljajući razmak na njeno mjesto u odjeljku ZAMJENA. Ako razmak zamijenimo riječju, ona će zamijeniti prvu (glupo):

$ jeka glupi pingvin | sed "s/\([a-z]*\) \([a-z]*\)/\2 pametan /" pametni pingvin

Numerički modifikator

Ovo je jedno/dvo/troznamenkasti broj koji se nalazi iza posljednjeg razdjelnika i označava koje podudaranje treba zamijeniti.

$ echo vrlo glupi pingvin | sed "s/[a-z]*/dobar/2" vrlo dobar pingvin

U ovom primjeru, svaka riječ je podudaranje, a uredniku smo rekli koju riječ želimo zamijeniti postavljanjem modifikatora 2 nakon odjeljka REPLACE.

Možete kombinirati numerički modifikator s modifikatorom /g. Ako trebate ostaviti prvu riječ nepromijenjenu, a drugu i sljedeće zamijeniti riječju "(izbrisano)", tada će naredba biti ovakva:

$ echo vrlo glupi pingvin | sed "s/[a-z]*/(izbrisano)/2g" vrlo (izbrisano) (izbrisano)

Ako stvarno želite ukloniti sva sljedeća podudaranja osim prvog, trebali biste staviti razmak u odjeljak ZAMIJENI:

$ echo vrlo glupi pingvin | sed "s/[a-z]*/ /2g" vrlo

Ili nemojte stavljati ništa:

$ echo vrlo glupi pingvin | sed "s/[^ ]*//2g" je vrlo

Numerički modifikator može biti bilo koji cijeli broj od 1 do 512. Na primjer, ako trebate staviti dvotočku iza 80. znaka svakog retka, naredba će vam pomoći:

$ sed "s/./&:/80" naziv datoteke

Modifikator /p - izlaz na standardni izlaz (ispis)

Program sed prema zadanim postavkama već ispisuje rezultat na standardni izlaz (na primjer, zaslon monitora). Ovaj modifikator se koristi samo s opcijom sed -n, koja samo blokira izlaz rezultata na ekran.

Modifikator /w

Omogućuje vam snimanje rezultata obrade teksta navedena datoteka:

$ sed "s/SAMPLE/REPLACE/w naziv datoteke

/e modifikator (GNU proširenje)

Omogućuje vam da odredite naredbu ljuske (ne sed program) kao ZAMJENU. Ako se pronađe podudaranje s UZORKOM, bit će zamijenjeno izlazom naredbe navedene u odjeljku ZAMIJENI. Primjer:

$ jeka noć | sed "s/noć/jeka dan/e" dan

/I i /i modifikatori (GNU proširenje)

Proces zamjene ne razlikuje velika i mala slova.

$ echo Noć | sed "s/noć/dan/i" dan

Kombinacije modifikatora

Modifikatori se mogu kombinirati kada to ima smisla. U ovom slučaju, modifikator w treba staviti zadnji.

Konvencije (GNU proširenje) Ima ih samo pet:

\L pretvara znakove REPLACE u mala slova \l pretvara sljedeći znak REPLACE u mala slova \U pretvara znakove REPLACE u velika slova \u pretvara sljedeći znak REPLACE u veliko slovo \E poništava prijevod započet s \L ili \U Iz očiglednih razloga, ove se konvencije koriste same. Na primjer:

$ jeka glupi pingvin | sed "s/glupi/\u&/" Glupi pingvin

$ echo malo štene | sed "s/[a-z]*/\u&/2" malo štene

Pokrili smo gotovo svaki aspekt naredbe sed. Sada je vrijeme da pogledamo opcije ovog programa.

mogućnosti programa sed

Program ima iznenađujuće malo opcija. (Što donekle kompenzira višak naredbi, modifikatora i drugih funkcija). Osim dobro poznatih opcija --help (-h) i --version (-V), koje nećemo razmatrati, postoje samo tri:

Opcija -e--izraz=skup_naredbi

Jedan od načina za izvršavanje više naredbi je korištenje opcije -e. Na primjer:

Sed -e "s/a/A/" -e "s/b/B/" naziv datoteke

Svi prethodni primjeri u ovom članku nisu zahtijevali opciju -e samo zato što su sadržavali jednu naredbu. Mogli smo koristiti -e opciju u primjerima, to ne bi ništa promijenilo.

Opcija -f Ako trebate izvršiti veliki broj naredbi, prikladnije je napisati ih u datoteku i koristiti opciju -f:

Sed -f sedscript naziv datoteke

Sedscript je ovdje naziv datoteke koja sadrži naredbe. Ova datoteka se naziva sed programska skripta (u daljnjem tekstu samo skripta). Svaka naredba skripte trebala bi zauzimati zaseban redak. Na primjer:

# komentar - Ova skripta će promijeniti sve male samoglasnike u velike samoglasnike s/a/A/g s/e/E/g s/i/I/g s/o/O/g s/u/U/g

Skriptu možete nazvati kako god želite, važno je ne brkati datoteku skripte s datotekom koja se obrađuje.

Opcija -n Program sed -n ne ispisuje ništa na standardni izlaz. Za primanje isplate potrebna vam je posebna uputa. Već smo se upoznali s modifikatorom /p koji se može koristiti za davanje takve indikacije. Sjetimo se datoteke zar.txt:

$ sed "s/1-9/&/p" zar.txt Ujutro je radio vježbe. Munja je električni naboj.

Budući da nisu pronađena podudaranja s UZORAKOM (nema brojeva u datoteci), naredba s s modifikatorom /p i znakom & kao ZAMJENOM (zapamtite da ampersand znači sam UZORAK) radi kao naredba cat.

Ako se u datoteci pronađe PATTERN, tada će se linije koje sadrže PATTERN udvostručiti:

$ sed "s/exercise/&/p" zar.txt Ujutro je radio vježbe. Ujutro je radio vježbe. Munja je električni naboj.

Dodajmo sada opciju -n:

$ sed -n "s/exercise/&/p" zar.txt Ujutro je radio vježbe.

Sada naš program radi kao naredba grep - vraća samo retke koji sadrže PATTERN.

Odabir željenih elemenata uređenog teksta

Koristeći samo jednu naredbu s, vidjeli smo nevjerojatne mogućnosti sed editora. Ali sve što radi svodi se na traženje i zamjenu. Štoviše, tijekom rada sed uređuje svaki redak jedan po jedan, ne obraćajući pozornost na ostale. Bilo bi zgodno ograničiti retke koje je potrebno promijeniti, na primjer:

  • Odaberite retke brojevima
  • Odaberite retke u određenom rasponu brojeva
  • Odaberite samo retke koji sadrže određeni izraz
  • Odaberite samo retke između nekih izraza
  • Odaberite samo retke od početka datoteke do nekog izraza
  • Odaberite samo retke od nekog izraza do kraja datoteke

Program sed čini sve to i više. Bilo koja naredba uređivača sed može se koristiti adresno, u određenom rasponu adresa ili s gornjim ograničenjima raspona linija. Adresa ili ograničenje moraju neposredno prethoditi naredbi:

Sed "naredba adresa/ograničenje"

Odabir redaka brojevima

Ovo je najjednostavniji slučaj. Samo označite broj tražene linije prije naredbe:

$ sed "4 s/[a-z]*//i" gumilev.txt Kakvo čudno blaženstvo U ranom sumraku jutra, U topljenju proljetnog snijega, svemu što propada i mudro.

$ sed "3 s/V/(V)/" gumilev.txt Čudno li blaženstvo U ranom sutonu jutra, (U) topljenju proljetnog snijega, U svemu što propada i mudro je.

Odabir redaka u nizu brojeva

Raspon je naznačen, što nije iznenađujuće, odvojen zarezima:

$ sed "2.3 s/V/(V)/" gumilev.txt Čudno li blaženstvo (U) ranom sutonu jutra, (U) topljenju proljetnog snijega, U svemu što propada i mudro je.

Ako trebate navesti raspon do posljednjeg retka datoteke, ali ne znate koliko redaka ima, upotrijebite znak $:

$ sed "2,$ s/in/(in)/i" gumilev.txt Kakvo čudno blaženstvo (u) ranom jutarnjem sumraku, (u) topljenju proljetnog snijega, (u) svemu što nestaje i jest mudar.

Odabir redaka koji sadrže izraz

Izraz za pretraživanje omeđen je kosim crtama (/) i postavljen ispred naredbe:

$ sed "/jutro/ s/in/(in)/i" gumilev.txt Čudno li blaženstvo (u) ranom sutonu jutra, U topljenju proljetnog snijega, U svemu što propada i mudro je.

Odabir redaka u rasponu između dva izraza

Kao i u slučaju brojeva redaka, raspon je naveden odvojen zarezima:

$ sed "/jutro/,/mudro/ s/in/(in)/i" gumilev.txt Kakvo čudno blaženstvo (u) ranom jutarnjem sumraku, (u) topljenju proljetnog snijega, (u) svemu koji propada i mudro .

Odabir redaka od početka datoteke do određenog izraza

$ sed "1,/snijeg/ s/in/(in)/i" gumilev.txt Kakvo čudno blaženstvo (u) ranom jutarnjem sumraku, (u) topljenju proljetnog snijega, U svemu što nestaje i jest mudar.

Odabir redaka od određenog izraza do kraja datoteke

$ sed "/snow/,$ s/in/(in)/i" gumilev.txt Kakvo čudno blaženstvo U ranom jutarnjem sutonu, (u) topljenju proljetnog snijega, (u) svemu što nestaje i jest mudar.

Ostale naredbe sed editora

d (brisanje) naredba

Uklanja sljedeće retke iz standardnog izlaza:

$ sed "2 d" gumilev.txt Čudno li blaženstvo U topljenju proljetnog snijega, U svemu što propada i mudro je.

I češće ga pišu jednostavnije (bez razmaka):

Sed "2d" gumilev.txt

Sve što je rečeno u prethodnom odjeljku o adresiranju stringova također se odnosi i na naredbu d (kao i na gotovo sve naredbe u sed editoru).

Pomoću naredbe d zgodno je izbaciti nepotrebno "zaglavlje" neke e-poruke:

$ sed "1,/^$/d" naziv datoteke

(Brisanje redaka od prvog do prvog praznog retka).

Riješite se komentara u konfiguracijskoj datoteci:

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

I nikad ne znate gdje trebate ukloniti suvišne linije!

naredba p (ispis).

Engleska riječ "print" prevodi se kao "print", što je na ruskom povezano s pisačem ili barem s tipkovnicom. Zapravo, ova riječ u engleskom kontekstu često jednostavno znači izlaz na zaslon monitora. Dakle, naredba p ne ispisuje ništa, već jednostavno prikazuje navedene retke.

Kada se koristi sama, naredba p udvostručuje retke u izlazu (uostalom, program sed ispisuje redak na ekran prema zadanim postavkama, ali naredba p ispisuje isti redak drugi put).

$ echo Imam mačku | sed "p" imam mačku imam mačku

Postoje namjene za ovo svojstvo, kao što je udvostručenje praznih redaka za poboljšanje izgleda teksta:

$ sed "/^$/ p naziv datoteke

Ali naredba p otkriva svoje prave boje u kombinaciji s opcijom -n, koja, kao što se sjećate, sprječava ispis linija na ekranu. Kombiniranjem opcije -n s naredbom p, možete dobiti samo potrebne retke u izlazu.

Na primjer, pogledajte retke od jedan do deset:

$ sed -n "1.10 p" naziv datoteke

Ili samo komentari:

$ sed -n "/^#/ p" /boot/grub/menu.lst # GRUB konfiguracijska datoteka "/boot/grub/menu.lst". # generira "grubconfig". Sun 23 Mar 2008 21:45:41 # # Start GRUB global section # End GRUB global section # Linux bootable partition config počinje # Linux bootable particija config završava # Linux bootable particija config počinje # Linux bootable particija config završava

Ovo jako podsjeća na program grep, s kojim smo se već susreli kada smo govorili o opciji -n s modifikatorom /p. Ali, za razliku od naredbe grep, uređivač sed omogućuje ne samo pronalaženje ovih redaka, već i njihovu promjenu, zamjenjujući, na primjer, posvuda Linux s Unixom:

$ sed -n "/^#/ p" /boot/grub/menu.lst | sed "s/Linux/Unix/" # GRUB konfiguracijska datoteka "/boot/grub/menu.lst". # generira "grubconfig". Sun 23 Mar 2008 21:45:41 # # Start GRUB global section # End GRUB global section # Unix konfiguracija particije za pokretanje počinje # Unix konfiguracija particije za pokretanje završava # Unix konfiguracija particije za pokretanje počinje # Unix konfiguracija particije za pokretanje završava

Tim!

Ponekad morate urediti sve retke osim onih koji odgovaraju UZORCU ili odabiru. Simbol uskličnik(!) obrće odabir. Na primjer, izbrišite sve retke osim drugog iz Gumiljovljevog katrena:

$ sed "2 !d" gumilev.txt U ranom jutarnjem sumraku,

Ili odaberite sve retke, osim komentara, iz /boot/grub/menu.lst datoteke:

$ sed -n "/^#/ !p" /boot/grub/menu.lst default 1 timeout 20 gfxmenu (hd0,3)/boot/naslov poruke SuSe on (/dev/hda3) root (hd0,2) kernel /boot/vmlinuz root=/dev/hda3 ro vga=773 acpi=off naslov Linux na (/dev/hda4) root (hd0,3) kernel /boot/vmlinuz root=/dev/hda4 ro vga=0x317

Naredba q (prekid)

Naredba q prekida sed program nakon navedenog retka. Ovo je zgodno ako morate zaustaviti uređivanje nakon što ste dosegli određenu točku u tekstu:

$sed "11 q" naziv datoteke

Ova naredba će završiti kada dođe do 11. retka.

Naredba q jedna je od rijetkih sed naredbi koje ne prihvaćaju nizove nizova. Naredba ne može prestati raditi 10 puta zaredom ako upišemo:

Sed "1.10 q" Apsurdno!

naredba w (pisati).

Poput modifikatora w naredbe s, ova vam naredba omogućuje pisanje izlaza programa u datoteku:

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

Primit ćemo datoteku gumilev.txt koja sadrži posljednja dva retka Gumiljovljevog katrena iz datoteke gumilev.txt. Štoviše, ako takva datoteka već postoji, bit će prebrisana. Ako ne upišete opciju -n, tada će program osim što će kreirati gum.txt datoteku, prikazati i cijeli sadržaj gumilev.txt datoteke.

Za rad na naredbenom retku prikladnije je koristiti uobičajeno preusmjeravanje izlaza (> ili >>), ali u sed skriptama naredba w vjerojatno će pronaći svoju primjenu.

r (čitaj) naredba

Ova naredba ne samo da će pročitati navedenu datoteku, već i zalijepiti njezin sadržaj na željeno mjesto u uređenoj datoteci. Za odabir “pravog mjesta” koristi se nama već poznato adresiranje (prema brojevima redaka, izrazima itd.). Primjer:

$ odjek Iz Gumiljovljeve pjesme: | sed "r gumilev.txt"

Iz Gumiljovljeve pjesme:

Čudno li blaženstvo U ranom sutonu jutra, U topljenju proljetnog snijega, U svemu što propada i mudro je.

Tim =

Dat će broj navedene linije:

$ sed "/snow/=" gumilev.txt Čudno li blaženstvo U ranom sutonu jutra, 3 U topljenju proljetnog snijega, U svemu što propada i mudro je.

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

Naredba prihvaća samo jednu adresu, ne prihvaća intervale.

Naredba y

Ova naredba zamjenjuje znakove iz odjeljka PATTERN znakovima iz odjeljka REPLACE, radeći poput programa tr.

$ echo Auto - nasljeđe prošlosti | sed "y/Auto/Paro/" Parni automobil - nasljeđe prošlosti

Tim g radi samo ako je broj znakova u UZORCU jednak broju znakova u ZAMJENI.

sed programske skripte

Da biste koristili sed editor kao punopravni uređivač teksta, morate savladati pisanje sed skripti. Program sed ima vlastiti jednostavan programski jezik koji vam omogućuje pisanje skripti koje mogu činiti čuda.

Ovaj članak ne može sadržavati opise sed skripti, kao što ni njegov autor ne postavlja sebi zadatak ovladati sed programskim jezikom. U ovom sam se članku usredotočio na korištenje sed editora u naredbenom retku, s namjerom da ga koristim kao filter u cijevima. Iz tog razloga, izostavio sam brojne sed naredbe koje se koriste samo u sed skriptama.

Mnogo je obožavatelja sed editora i mnogo članaka na temu skriptiranja, uključujući i RuNet. Stoga onima koji su zainteresirani za ovaj prekrasan program neće biti teško proširiti svoje znanje.

Program sed i ćirilični znakovi

Kao što se može vidjeti iz primjera u ovom članku, sed program na ispravno rusificiranom sustavu tečno govori "veliki i moćni" jezik.

Sažetak programa sed

Program sed je multifunkcionalni uređivač protoka podataka, neophodan za:

  • Uređivanje velikih tekstualnih nizova
  • Uređivanje datoteka bilo koje veličine kada je slijed radnji uređivanja previše složen
  • Uređivanje podataka čim postanu dostupni, uključujući i u stvarnom vremenu - to jest, u slučajevima kada je teško ili potpuno nemoguće koristiti interaktivne uređivače teksta.

Za potpuno ovladavanje sed programom bit će potrebni tjedni ili čak mjeseci rada, jer to zahtijeva:

  • Naučite regularne izraze
  • Naučite pisati sed skripte svladavanjem jednostavnog programskog jezika koji se koristi u tim skriptama

S druge strane, svladavanje nekoliko najčešćih naredbi u sed editoru nije ništa teže od bilo koje Unix naredbe; Nadam se da će vam ovaj članak pomoći u tome.

Pogovor

Do sada sam u člancima serije Human Man pokušao barem ukratko otkriti svaku opciju, svaki parametar naredbe koji se opisuje, kako bi članak mogao zamijeniti manu. I ubuduće ću se pridržavati ovog principa.

Ovaj je članak iznimka jer ne opisuje sve značajke programa. Za njihov potpuni opis ne bi bio potreban članak, već knjiga. Međutim, članak vam omogućuje da steknete ideju o sed editoru i počnete s ovim nevjerojatnim programom pomoću njegovih najčešćih naredbi.



2024 wisemotors.ru. Kako radi. Željezo. Rudarstvo. Kriptovaluta.