Primjeri Bash Seda

Bash Sed Examples



Bash vam omogućuje da izvršite zamjenu uzorka pomoću varijabilnog proširenja poput ($ {var/pattern/replacement}). I tako, radi li se sed ovako (sed -e ‘s/pattern/replacement/’). Međutim, sed ima više od zamjene uzoraka u tekstualnim datotekama. Ovdje ćemo ponovno otkriti sed, na primjer, s ekvivalentnim naredbama i tijekovima rada za pomoć u svakodnevnim zadacima.

Postavljanje primjera sed

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







riječije tekstualna datoteka koja sadrži brojeve od 1 do 100. Ako niste sigurni u naredbu za njezino stvaranje, pogledajte Izvoz funkcija za xargs u Bash naredbi za izvoz. Nikad ne znate da je to možda u vašem sljedećem intervjuu za skriptiranje ljuske.



barje tekstualna datoteka koja sadrži jedan redak -.



old-phpje tekstualna datoteka koja sadrži retke starog PHP -a koji će se prekinuti u php7 ili novijoj verziji. (Savjet: ereg)





Imajte na umu da se sve gore opisane funkcije mogu pronaći ispod u Endnoteu o funkcijama za postavljanje.

Primjeri Sed s ekvivalentnim naredbama

U okruženju naredbenog retka vidjet ćete da postoji više od jednog rješenja za zadani zadatak. Međutim, većim dijelom želite ići putem koji daje najmanji otpor. Ovdje je popis primjera sed naredbi s odgovarajućim ekvivalentnim naredbama, gdje će neke biti dolje detaljno obrađene.



1. Ispišite nasumični redak (ekvivalent sortiranju -R -| glava -1)

sed -n '$ ((SLUČAJNO % 100)) p '-

2. Ispišite posljednji redak u datoteci (ekvivalent glavi -1 -)

sed -n '$ p'-

3. Ispišite prvih 10 redaka u datoteci (ekvivalent glavi -n 10 -)

sed '10q'-

4. Ispišite prvi redak u datoteci (ekvivalent rep -1 -)

sed -n '1p'-

5. Izbrišite sve instance znaka (ekvivalentno tr –brisati ‘0’ -, gdje je 0 znak koji želimo izbrisati)

sed -I 's / 0 // g'-

6. Pretvorite csv datoteku u tsv (ekvivalent tr ',' ' t' -)

sed -I 's/,/ t/g'-

7.Dodajte redak u datoteku (ekvivalent cat bar -)

sed '$ a ---'-

8. Prethodni redak u datoteku (ekvivalent cat -baru)

sed '1i ---'-

9. Ispišite sve retke u datoteci (ekvivalentno cat -)

sed -n -I 'p'-

10. Ispišite retke koji odgovaraju uzorku (ekvivalent grep -e ‘^1’ -)

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

11. Izbrišite retke koji odgovaraju uzorku (ekvivalent grep -v -e ‘^1’ -)

sed -I '/^1/ d'-

12. Dobijte broj redaka u datoteci (ekvivalentno wc -l -)

sed -n -I '$ ='-

13. Zapisivanje u datoteku u pozadini (ekvivalentna naredba)

sed 'u{1} USD'-

Primjer korištenja sed za implementaciju naredbe tee

Odmah iznad nalazi se primjer s oznakom Zapisi u datoteku u pozadini. Vrsta zvukova poput naredbe tee. Pa jest. Ovdje ćemo proširiti kako implementirati funkciju zamjene tee u bash pomoću sed.

Naredbe

tee ()
{
test $ {#} -ekv 1 || povratak;
sed 'u{1} USD'-
}
glavni()
teeovaj;
mačkaovaj

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. Prvi je iz naredbe seq. Drugi dobivamo od mačke datoteke napisane u tee -u. Znam da je smiješno, ali radi!

Primjer korištenja sed za ispis nasumičnog retka u datoteci

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

Implementirajte funkciju koja

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

Ova funkcija očekuje da će ulaz biti spolja spojen.

Naredbe

neka linija()
{
funkcijalc()
{
sed -n -I '$ ='-
};
funkcijaispisna linija()
{
sed -n -I '{1} USDp '-
};
temp= $( mktemp );
mačka-> $ {temp};
mačka $ {temp} |ispisna linija $((SLUČAJNO%$( mačka $ {temp} |lc)+1 ));
rm $ {temp}
}

Primjer upotrebe (1)

slijedeće 100 |_

Izlaz (1)

35

Primjer uporabe (2)

curl https://linuxhint.com/bash_cut_command/ -tiho |strip-tags|neka linija

Pogledajte donji primjer korištenjem sed za uklanjanje HTML oznaka. Imajte na umu da gornji primjer ponekad vraća prazno za prazne retke. Kao vježba, može se poboljšati.

Korištenje sed za ispis linija u datoteci

Pretpostavimo da želite implementirati funkciju u bash za ispis zadanog 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 korištenjem sed bila bi sljedeća.

Naredbe

ispisna linija()
{
sed -n '{1} USDp '-
}

Sada da vidimo što se događa kada koristimo print-line na riječima.

Naredbe

riječi|ispisna linijapedeset

Izlaz

pedeset

U redu. Izgleda dobro, ali pokušajmo nešto što izgleda malo manje trivijalno.

Naredbe

proglasiti -xfriječi
proglasiti -xfispisna linija
slijedeće 1 10$(riječi| zahod - ) | xargs-ibash -c 'riječi | linija za ispis {} '

Izlaz

1
jedanaest
dvadeset i jedan
31
41
51
61
71
81
91

U redu. Sad je to već sličnije! Vidite kako se sed može koristiti u bash skripti za ispis bilo kojeg retka u datoteci.

Primjeri Sed bez ekvivalentnih naredbi

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

Naredite sve retke u skripti ljuske

sed -I 's/^/#/'-
Izbrišite prvi redak
sed -I '1d'-
Izbrisatiposljednjicrta
sed -I '$ d'-
Umetnite redak prije linija koje odgovaraju uzorku
sed '/0 $/i ---'-
Umetnite redak nakon redaka koji odgovaraju uzorku
sed ' / 0 $ / ---'-
Skinite html oznake
sed -I 's/*** .// g'-
Nadogradite eregustari php kod za pokretanjeuphp7 ili noviji
sed 's/ereg ( ([^,]*). ([^)]*) ./ strpos ( 2, 1)/g'
Čekako sedje ranije od određene verzije
sed -I 'v 4.5'-

Primjer sed verzije koja se grana u bash

Gore u primjerima postoji redak za provjeru je li sed stariji od određene verzije koji možemo upotrijebiti za implementaciju grananja verzije u bash, što je vjerujem lakše nego pokušati implementirati funkciju za usporedbu brojeva verzija iz sed -verzije izlaza . Ta jedina zamka je da ako postoji ranija verzija sed koja ne podržava naredbu v, onda smo u problemu.

Naredbe

test-sed-version-at-most() {
izbaciti -n | sed 'v{1} USD'-2> /dev/null
}
try-verzija()
{
izbaciti -n 'Verzija{1} USD. U redu. Učini to ';
test-sed-version-at-most{1} USD && {
izbaciti -n 'star';
pravi
} || {
izbaciti -n 'novi'
};
izbaciti ' put.'
}
glavni()
{
lokalnov;
zavu 4.{4,5};
čini
try-verzija$ {v};
učinjeno
}
glavni

Izlaz

Verzija4.4. U redu. Učinite to na stari način.
Verzija4.5. U redu. Učinite to na novi način.

Imajte na umu da je verzija sed -a koja radi na mom stroju od upisivanja ovih znakova 4.4, što bi objasnilo gornji izlaz. Također, u isto vrijeme, najnovija verzija gnu sed bila je 4.7, oko 3 godine starija od one koju imam. Moj sed je star! Zapravo, u sed 4.0.6, naredbi verzije je dodan parametar pa ova strategija funkcionira za sve navedene barem v4.0.6, što je blaže s obzirom da je verzija objavljena početkom 2003. Dobri ste.

Dodatno sam kopao, zapravo NOVOSTI čitajući najnoviji izvorni kod. Verzija 4.6 ima novu značajku, –debug koja ispisuje skriptu i bilježi izlazne retke. To bi vam omogućilo prevođenje sed skripti koje generiraju funkcije u bash u kanonski oblik. Kul! Samo ne zaboravite da vam je potrebna sed verzija koja se grana u bash. Tu dolazi do izražaja ovaj primjer sed.

Primjer bash funkcije pomoću sed za skidanje HTML oznaka

U gornjim primjerima postoji redak za uklanjanje HTML oznaka. Ubacimo to u funkciju bash i upotrijebimo je za uklanjanje svih HTML oznaka iz prošlog članka koji sam napisao.

Naredbe

strip-tags()
{
sed -I 's/*** .// g'-
}
curl https://linuxhint.com/bash_cut_command/ -tiho |strip-tags

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

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

Može se sa sigurnošću reći da su promjene napravljene pomoću sed -a s opcijom -i nepovratne. To jest, osim ako niste potpuno sigurni koji tekst želite zamijeniti, vjerojatno ćete završiti s jednim znakom manje od predviđenog. Zato ćemo u ovom primjeru koristiti sed u tijeku rada za sigurnu zamjenu teksta u svim datotekama koje ste odabrali.

Tijek rada

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

Ovdje ćete odabrati datoteke koje podliježu zamjeni. Predlažem korištenje naredbe u sljedećim redovima:

pronaći -tipf-Ime | zahvat -v-I| xargs-ja ...

Na primjer, možda ćete htjeti ograničiti datoteke tako da zamijene PHP datoteke, isključujući direktorije spremišta git na sljedeći način.

pronaći -tipf-Ime*.php| zahvat -v -I '.ići' | xargs -i...

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

zahvat

Zatim ćemo pokušati upariti some_pattern u datotekama odabranim na sljedeći način. Imajte na umu da budući da koristimo -o opciju za grep, izlaz će prikazati samo usklađeni niz ako ga ima.

pronaći -tipf-Ime*.php| zahvat -v -I '.ići' |
xargs -i zahvat -Ineki_uzorak-ili

Gornja naredba trebala bi vratiti popis nizova koji odgovaraju some_pattern.

sed

Na kraju, želimo zamijeniti sve nizove koji odgovaraju some_pattern. Da bismo to učinili, moramo pretvoriti grep u sed na sljedeći način.

pronaći -tipf-Ime*.php| zahvat -v -I '.ići' |
xargs -i sed -i -Is/neki_uzorak/zamjena/g

Naredba grep postaje sed -i, a opcija -o se uklanja. I eto ga.

Sada možete provjeriti koji će se nizovi zamijeniti u sed -u umjesto da testirate svoju sreću.

Napomene o opcijama koje se koriste u primjerima

Ovdje je popis opcija korištenih u primjerima sed o kojima se ukratko govori.

Opcija Opis
-i Uredite na mjestu. Ako je ulaz datoteka (nije unesena cijevi), rezultat izraza prebrisat će sadržaj datoteke.

Sed prihvaća jednu

npr. sed -n ...

-I -e znači 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 ispisni izraz na sed jeziku, tada retci koji nisu uključeni u ispisni iskaz neće biti uključeni u izlaz.

npr. sed -n ...

Za više informacija o dostupnim opcijama sed, pogledajte sed –help

Završne napomene o ekvivalentnim naredbama koriste se u primjerima

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

  • vrsta
  • glava
  • rep
  • zahvat
  • mačka
  • NS
  • tee

Završna bilješka na kraju - u primjerima ekvivalentne naredbe

U slučaju da se pitate što se događa s znakom - u primjeru, ova je bilješka za vas. Dodao sam znak - nakon većine naredbi u primjerima kako bi nagovijestio da očekujemo da će ulaz biti primljen kroz cijev. To je,

mačkaneka datoteka| vrsta -R-| glava -1

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

mačkaneka datoteka| vrsta -R | glava -1

To se događalo s naredbama - znak za naredbom u primjerima.

Napomene o funkcijama za postavljanje

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

Naredbe

riječi()
{
slijedeće 100
}
bar()
{
izbaciti ---
}
old-php()
{
izbaciti 'ereg ($ UA,' Bottybot ')'
}

Poanta

Uživao sam u pisanju primjera za Bash sed, pa sam čak i usput pokupio nekoliko dodatnih trikova. Sed je moćan uslužni program za naredbeni redak i izražajan jezik za rukovanje tekstualnim datotekama. Ako ste voljeli učiti o sed, ne brinite, ima još puno toga za dotaknuti. Sed na.