sed

Primjeri Bash Seda

Primjeri Bash Seda
Bash vam omogućuje izvođenje zamjene uzoraka korištenjem varijabilnog proširenja poput ($ var / pattern / replacement). I tako, čini li sed poput ovog (sed -e 's / pattern / replacement /'). Međutim, tu je i više nego zamjena uzoraka u tekstualnim datotekama.  Ovdje ćemo ponovno otkriti sed, na primjer, s ekvivalentnim naredbama i tijekovima rada koji pomažu u svakodnevnim zadacima.

Postavljanje primjera sed

Evo kratkog vodiča za postavljanje primjera, koji ću pokušati ne pretjerati.

"Riječi" je tekstualna datoteka koja sadrži brojeve od 1 do 100. Ako niste sigurni u naredbu za njezino stvaranje, pogledajte Izvoz funkcije za xargs u naredbi Bash Export. Nikad ne znate da bi to moglo biti na vašem sljedećem intervjuu za skriptiranje školjki.

"Bar" je tekstualna datoteka koja sadrži jedan redak -.

"Old-php" je tekstualna datoteka koja sadrži retke starog PHP-a koji će se slomiti u php7 ili novijoj verziji. (Savjet: ereg)

Imajte na umu da se sve gore opisane funkcije mogu naći u nastavku u Endnote o funkcijama za postavljanje.

Sed primjeri s ekvivalentnim naredbama

U okruženju naredbenog retka vidjet ćete da postoji više rješenja za zadani zadatak. Međutim, većinom želite ići putem koji daje najmanji otpor. Evo popisa primjera sed naredbi s odgovarajućim ekvivalentnim naredbama, gdje će neke biti detaljno obrađene u nastavku.

1. Ispis slučajnog retka (ekvivalentno sortiranju -R - | glava -1)

sed -n "$ ((RANDOM% 100)) p" -

2.Ispis posljednjeg retka u datoteci (ekvivalent glavi -1 -)

sed -n '$ p' -

3. Ispis prvih 10 redaka u datoteci (ekvivalentno glavi -n 10 -)

sed '10q' -

4. Ispis prvog retka u datoteci (ekvivalentno repu -1 -)

sed -n '1p' -

5. Izbrišite sve instance znaka (ekvivalentno tr -delete '0' -, gdje je 0 znak koji želimo izbrisati)

sed -e 's / 0 // g' -

6. Pretvori csv datoteku u tsv (ekvivalentno tr ', "\ t' -)

sed -e 's /, / \ t / g' -

7.Dodaj redak u datoteku (ekvivalent mačjoj traci -)

sed '$ a ---' -

8. Dodavanje retka u datoteku (ekvivalent mački - bar)

sed '1i ---' -

9. Ispišite sve retke u datoteci (ekvivalent mački -)

sed -n -e 'p' -

10. Ispišite linije koje odgovaraju uzorku (ekvivalentno grep -e '^ 1' -)

sed -n -e '/ ^ 1 / p' -

11. Izbrišite linije koje odgovaraju uzorku (ekvivalentno grep -v -e '^ 1' -)

sed -e '/ ^ 1 / d' -

12. Dohvatite broj redaka u datoteci (ekvivalent wc -l -)

sed -n -e '$ =' -

13. Zapis u datoteku u pozadini (ekvivalentna naredba tee)

sed "w $ 1" -

Primjer korištenja sed za provedbu naredbe tee

Odmah iznad, u pozadini je primjer s oznakom Zapisivanje u datoteku. Vrsta zvuka poput zapovijedi tee. Pa je. Ovdje ćemo proširiti kako implementirati funkciju za zamjenu tee u bash pomoću sed.

Naredbe

majica ()

test $ # -eq 1 || povratak;
sed "w $ 1" -

glavni ()

slijed 10 | majica deset;
mačka deset

glavni

Izlaz

1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10

Ovdje ćete vidjeti dva popisa cijelih brojeva od 1 do 10. Prva je iz naredbe seq. Sekundu dobivamo od mačke datoteke napisane u tee. Znam da je smiješno, ali djeluje!

Primjer upotrebe sed za ispis slučajnog retka u datoteci

Pretpostavimo da želimo ispisati slučajni redak u datoteci koristeći bash i malo sed. Možemo li to učiniti? Da mi možemo! Evo kako.

Provesti funkciju koja

  1. Dobiva broj redaka u datoteci, L
  2. Generira slučajni broj između 1 i L, R
  3. Ispisuje R

Funkcija očekuje da se ulaz cijevi izvana.

Naredbe

neki redak ()

funkcija lc ()

sed -n -e '$ =' -
;
funkcija print-line ()

sed -n -e "$ 1 p" -
;
temp = $ (mktemp);
mačka -> $ temp;
mačka $ temp | linija za ispis $ ((SLUČAJNO% $ (mačka $ temp | lc) + 1));
rm $ temp

Primjer upotrebe (1)

slijed 100 | _

Izlaz (1)

35

Primjer upotrebe (2)

curl https: // linuxhint.com / bash_cut_command / --silent | trake-oznake | neke crtice

Pogledajte primjer u nastavku, koristeći sed za uklanjanje HTML oznaka. Primijetite da se primjer over ponekad vraća prazno za prazne retke. Kao vježba, može se poboljšati.

Korištenje sed za ispis redaka u datoteci

Pretpostavimo da želite implementirati funkciju u bash za ispis određenog retka u datoteci. Pokušaj ispisa jednog retka u datoteci pomoću petlje u bash, head, tail ili awk previše je posla za ispis redaka u datoteci. Dobro da imamo sed. Rezultirajuća funkcija pomoću sed bi bila sljedeća.

Naredbe

crta za ispis ()

sed -n "$ 1 p" -

Sada da vidimo što će se dogoditi kada koristimo ispisnu liniju na riječima.

Naredbe

riječi | linija za ispis 50

Izlaz

50

u redu. Izgleda dobro, ali probajmo nešto što izgleda malo manje trivijalno.

Naredbe

izjaviti -xf riječi
izjaviti -xf ispisnu liniju
slijed 1 10 $ (riječi | wc -l) | xargs -i bash -c "riječi | crta za ispis "

Izlaz

1
11
21
31
41
51
61
71
81
91

u redu. Sad je to više slično! Vidite kako se sed može koristiti u bash skripti za ispis bilo kojeg retka u datoteci.

Sed primjeri bez ekvivalentnih naredbi

U okruženju naredbenog retka ponekad je put do rješenja koje daje najmanji otpor sed put; u suprotnom, na kraju ćete obaviti više posla nego što je potrebno. Neke naredbe mogu se naći u nastavku.

Naredite sve retke u skripti ljuske

sed -e 's / ^ / # /' -
Izbriši prvi redak
sed -e '1d' -
Izbriši zadnji redak
sed -e '$ d' -
Umetnite liniju prije linija koje odgovaraju uzorku
sed '/ 0 $ / i ---' -
Umetnite redak nakon redaka koji odgovaraju uzorku
sed '/ 0 $ / ---' -
Uklonite html oznake
sed -e 's /<[^>] *.// g ' -
Nadogradite ereg na stari php kôd da bi se izvodio u php7 ili novijoj verziji
sed 's / ereg (\ ([^,] * \).\ ([^)] * \)./ strpos (\ 2, \ 1) / g '
Provjerite je li sed ranije od određene verzije
sed -e 'v 4.5 ' -

Primjer sed verzije koja se grana u bash

Iznad u primjerima postoji redak za provjeru je li sed ranije od određene verzije koji možemo koristiti za implementaciju razgranavanja verzija u bash, što je vjerujem jednostavnije od pokušaja implementacije funkcije za usporedbu brojeva verzija iz izlaza sed -version. Jedina zamka je u tome što ako postoji ranija verzija sed koja ne podržava naredbu v, onda smo u nevolji.

Naredbe

test-sed-version-at-most ()
odjek -n | sed "v $ 1" - 2> / dev / null

proba-verzija ()

echo -n "Verzija $ 1. u redu. Učini ";
test-sed-verzija-najviše $ 1 &&
echo -n "stari";
pravi
||
odjek -n "novo"
;
odjek "način."

glavni ()

mjesni v;
za v u 4.4,5;
čini
proba-verzija $ v;
gotovo

glavni

Izlaz

Verzija 4.4. u redu. Učini to na stari način.
Verzija 4.5. u redu. Učini to na novi način.

Imajte na umu da je verzija sed na vašem stroju otkucavanjem ovih znakova 4.4, što bi objasnilo gore navedeni rezultat. Također, u isto vrijeme, najnovija verzija gnu sed bila je 4.7, otprilike 3 godine starija od ove koju imam. Moja sed je stara! Zapravo, u sedmici 4.0.6, parametar je dodan naredbi verzije, tako da ova strategija djeluje za bilo koji navedeni barem v4.0.6, što je popustljivo s obzirom na to da je verzija objavljena početkom 2003. Ti si dobar.

Dodatno sam kopao, zapravo VIJESTI čitajući najnoviji izvorni kod. Verzija 4.6 ima novu značajku, -debug koja izbacuje skriptu i bilježi izlazne retke. To bi vam omogućilo da sed skripte generirane funkcijama u bashu prevedete u kanonski oblik. Super! Samo ne zaboravite da vam treba sed verzija koja se grana u bash. Tu dolazi do izražaja ovaj primjer sed.

Primjer bash funkcije pomoću sed za uklanjanje HTML oznaka

U gornjim primjerima postoji redak za uklanjanje HTML oznaka. Ubacimo to u bash funkciju i pomoću nje uklonimo sve HTML oznake iz zadnjeg članka koji sam napisao.

Naredbe

strip-tagovi ()

sed -e 's /<[^>] *.// g ' -

curl https: // linuxhint.com / bash_cut_command / --silent | trake-oznake

Ne mogu reći da je savršen, ali barem je čitljiv u terminalu.

Sed primjeri s tijekovima rada: Primjer tijeka rada: sigurno zamijenite sve pomoću find, grep i sed

Sigurno je reći da su promjene izvršene korištenjem sed s opcijom -i nepovratne. To je, osim ako niste potpuno sigurni koji tekst treba zamijeniti, vjerojatno ćete završiti s jednim znakom manje nego što je zamišljeno. Zbog toga ćemo u ovom primjeru koristiti sed u toku rada za sigurnu zamjenu teksta u svim datotekama koje ste odabrali.

Tijek rada

  1. pronaći
  2. grep
  3. sed
pronaći

Ovdje ćete odabrati datoteke koje će biti zamijenjene. Predlažem upotrebu naredbe u ovim redovima:

pronađi -tip f -ime | grep -v -e | xargs -i ..

Na primjer, možda ćete htjeti ograničiti datoteke da zamjenjuju PHP datoteke, izuzimajući direktorije git spremišta, kako slijedi.

pronađi -tip f -ime \ *.php | grep -v -e '.git '| xargs -i ..

Pročitajte više o naredbi xargs u bashu.

grep

Dalje, pokušat ćemo uskladiti neki_ obrazac u odabranim datotekama na sljedeći način. Imajte na umu da budući da za grep koristimo opciju -o, izlaz će prikazati samo podudarni niz ako postoji.

pronađi -tip f -ime \ *.php | grep -v -e '.git '|
xargs -i grep -e neki_uzorak -o

Gornja naredba trebala bi vratiti popis niza koji se podudaraju s nekim_ uzorkom.

sed

Konačno, želimo zamijeniti sve nizove koji se podudaraju s nekim_ uzorkom. Da bismo to učinili trebamo pretvoriti grep u sed kako slijedi.

pronađi -tip f -ime \ *.php | grep -v -e '.git '|
xargs -i sed -i -e s / neki_ obrazac / zamjena / g

Naredba grep postaje sed -i, a opcija -o je uklonjena. Eto ti ga.

Sada možete prethodno provjeriti koje će žice biti zamijenjene u sed umjesto da iskušavate svoju sreću.

Bilješke uz opcije korištene u primjerima

Ovdje je popis opcija korištenih u sedim primjerima koji su ukratko razmatrani.

Opcija Opis
-ja Uredite na mjestu. Ako je unos datoteka (koja nije u cijevi), rezultat izraza će prebrisati sadržaj datoteke.

Sed prihvaća jednog

npr.) sed -n…

-e -e označava izraz. Njegov je parametar izraz u sed jeziku.

Sed prihvaća mnoge

npr.) sed -e 'expr1' -e 'expr2' ..

-n Sakriva liniju na koju izraz ne utječe. To jest ako je izraz iskaz za ispis na jeziku sed, tada redovi koji nisu uključeni u ispis neće biti uključeni u izlaz.

npr.) sed -n…

Za više dostupnih opcija sed, pogledajte sed -help

Završne bilješke o ekvivalentnim naredbama koje se koriste u primjerima

Sljedeći uslužni programi naredbenog retka uključeni su u primjere sed s ekvivalentnim naredbama.

Završna bilješka na pratećem - u primjeru ekvivalentnih naredbi

U slučaju da se pitate što se događa u znaku - primjer, ova napomena je za vas. Dodao sam znak - nakon većine naredbi u primjerima kako bih nagovijestio da očekujemo da se ulaz prima kroz cijev. To je,

mačka neka datoteka | razvrstaj -R - | glava -1

Međutim, kada je prisutna naredba s lijeve strane cijevi, savjet možemo izostaviti na sljedeći način.

mačka neka datoteka | razvrstaj -R | glava -1

To se događalo sa znakom - nakon naredbi u primjerima.

Bilješke o funkcijama za postavljanje

U slučaju da tražite, ovdje su funkcije postavljanja za gornje primjere. Izlaz dobiven pomoću proglašenja -f. Pročitajte više o naredbi declare u bashu za više upotreba.

Naredbe

riječi ()

slijed 100

traka ()

jeka ---

stari-php ()

echo 'ereg ($ UA, "Bottybot")'

Poanta

Uživao sam u pisanju primjera Bash sed, a usput sam čak i pokupio nekoliko dodatnih trikova. Sed je moćan uslužni program naredbenog retka i izražajan jezik za manipulaciju tekstualnim datotekama. Ako ste voljeli učiti o sed, ne brinite se još puno toga što još treba dotaknuti. Sed na.

Kako promijeniti pokazivač miša i veličinu, boju i shemu pokazivača na sustavu Windows 10
Pokazivač i pokazivač miša u sustavu Windows 10 vrlo su važni aspekti operativnog sustava. To se može reći i za druge operativne sustave, tako da u is...
Besplatni i otvoreni kodni pokretački programi za razvoj Linux igara
Ovaj će članak pokriti popis besplatnih i open source pokretačkih igara koje se mogu koristiti za razvoj 2D i 3D igara na Linuxu. Brojni su takvi moto...
Vodič za Shadow of the Tomb Raider za Linux
Shadow of the Tomb Raider dvanaesti je dodatak seriji Tomb Raider - franšizi u akcijsko-avanturističkoj igri koju je stvorio Eidos Montreal. I kritiča...