sed

Bash Sed Exemple

Bash Sed Exemple
Bash vă permite să efectuați înlocuirea modelului utilizând expansiune variabilă, cum ar fi ($ var / pattern / replacement). Și așa, se simte așa (sed -e 's / pattern / replacement /'). Cu toate acestea, există mai multe de rezolvat decât înlocuirea modelelor în fișierele text.  Aici vom redescoperi sedul, de exemplu, cu comenzi echivalente și fluxuri de lucru pentru a vă ajuta în sarcinile de zi cu zi.

Configurare pentru exemple sed

Iată un ghid rapid pentru a configura exemplul, pe care voi încerca să nu-l fac prea exagerat.

„Cuvinte” este un fișier text care conține numerele de la 1 la 100. Dacă nu sunteți sigur de comanda de creare a acesteia, consultați Funcția de export pentru xargs în Bash Export Command. Nu știi niciodată că s-ar putea să fie la următorul dvs. interviu de scripting shell.

„Bară” este un fișier text care conține o singură linie -.

„Old-php” este un fișier text care conține linii de PHP vechi care se vor rupe în php7 sau mai târziu. (Sfat: ereg)

Rețineți că toate funcțiile descrise mai sus pot fi găsite mai jos în Endnote on functions for setup.

Exemple Sed cu comenzi echivalente

Într-un mediu de linie de comandă, veți găsi că există mai multe soluții la o anumită sarcină. Cu toate acestea, în cea mai mare parte, doriți să mergeți pe calea care dă cea mai mică rezistență. Iată o listă de exemple de comenzi sed cu comenzi echivalente corespunzătoare, unde unele vor fi tratate în detaliu mai jos.

1. Imprimați o linie aleatorie (echivalentă cu sortarea -R - | cap -1)

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

2.Imprimați ultima linie din fișier (echivalent cu capul -1 -)

sed -n '$ p' -

3. Imprimați primele 10 linii într-un fișier (echivalent cu capul -n 10 -)

sed '10q' -

4. Imprimați prima linie dintr-un fișier (echivalent cu coada -1 -)

sed -n '1p' -

5. Ștergeți toate instanțele unui caracter (echivalent cu tr-ștergeți „0” -, unde 0 este caracterul pe care dorim să îl ștergeți)

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

6. Convertiți fișierul CSV în tsv (echivalent cu tr ', "\ t' -)

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

7.Adăugați linia la fișier (echivalent cu bara de pisică -)

sed '$ a ---' -

8. Prepend linie la fișier (echivalent cu cat-bar)

sed '1i ---' -

9. Imprimați toate liniile din fișier (echivalent cu cat -)

sed -n -e 'p' -

10. Imprimați o linie care se potrivește cu un model (echivalent cu grep -e '^ 1' -)

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

11. Ștergeți liniile care se potrivesc cu un model (echivalent cu grep -v -e '^ 1' -)

sed -e '/ ^ 1 / d' -

12. Obțineți numărul de linii dintr-un fișier (echivalent cu wc -l -)

sed -n -e '$ =' -

13. Scrieți într-un fișier în fundal (comandă echivalentă tee)

sed "w $ 1" -

Exemplu folosind sed pentru a implementa comanda tee

Chiar deasupra, există un exemplu etichetat Scrieți într-un fișier în fundal. Un fel de sunete precum comanda tee. Ei bine, este. Aici vom dezvălui cum să implementăm o funcție pentru a înlocui tee în bash folosind sed.

Comenzi

tee ()

testa $ # -eq 1 || întoarcere;
sed "w $ 1" -

main ()

sec. 10 | tee zece;
pisica zece

principal

Ieșire

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

Aici veți vedea două listări ale numerelor întregi de la 1 la 10. Primul este din comanda seq. A doua o primim de la pisica dosarului scrisă în tee. Știu că este ridicol, dar funcționează!

Exemplu folosind sed pentru a imprima o linie aleatorie într-un fișier

Să presupunem că vrem să imprimăm o linie aleatorie într-un fișier folosind bash și un pic de sed. Putem sa o facem? Da putem! Iată cum.

Implementați o funcție care

  1. Obține numărul de linii dintr-un fișier, L
  2. Generează un număr aleatoriu între 1 și L, R
  3. Tipărește R

Funcția se așteaptă ca intrarea să fie canalizată din exterior.

Comenzi

unele-linie ()

funcția lc ()

sed -n -e '$ =' -
;
funcție print-line ()

sed -n -e „$ 1 p” -
;
temp = $ (mktemp);
pisică -> $ temp;
cat $ temp | linia de imprimare $ ((RANDOM% $ (cat $ temp | lc) + 1));
rm $ temp

Exemplu de utilizare (1)

sec 100 | _

Ieșire (1)

35

Exemplu de utilizare (2)

curl https: // linuxhint.com / bash_cut_command / --silent | strip-tags | unele-linie

Vedeți exemplul de mai jos, folosind sed pentru a elimina etichetele HTML. Rețineți că exemplul peste revine uneori gol pentru liniile goale. Ca exercițiu, poate fi îmbunătățit.

Folosind sed pentru a imprima liniile într-un fișier

Să presupunem că doriți să implementați o funcție în bash pentru a imprima o linie dată într-un fișier. Încercarea de a imprima o singură linie într-un fișier folosind o buclă în bash, head, tail sau awk este prea multă muncă pentru imprimarea liniilor într-un fișier. Bine că am sed. Funcția rezultată folosind sed ar fi după cum urmează.

Comenzi

linie de imprimare ()

sed -n „$ 1 p” -

Acum să vedem ce se întâmplă când folosim linia de imprimare pe cuvinte.

Comenzi

cuvinte | linia de imprimare 50

Ieșire

50

Bine. Arată bine, dar să încercăm ceva care arată puțin mai puțin banal.

Comenzi

declara cuvinte -xf
declara -xf-line de imprimare
seq 1 10 $ (cuvinte | wc -l) | xargs -i bash -c "cuvinte | linie de imprimare "

Ieșire

1
11
21
31
41
51
61
71
81
91

Bine. Acum, asta seamănă mai mult! Vedeți cum poate fi folosit sed într-un script bash pentru a imprima orice linie dintr-un fișier.

Exemple de Sed fără comenzi echivalente

Într-un mediu de linie de comandă, uneori calea către o soluție care dă cea mai mică rezistență este calea sed; în caz contrar, ajungeți să faceți mai multă muncă decât este necesar, în primul rând. Unele comenzi pot fi prezentate mai jos.

Comandați toate liniile dintr-un script shell

sed -e 's / ^ / # /' -
Ștergeți prima linie
sed -e '1d' -
Ștergeți ultima linie
sed -e '$ d' -
Introduceți o linie înainte de liniile care se potrivesc cu un model
sed '/ 0 $ / i ---' -
Introduceți o linie după liniile care se potrivesc cu un model
sed '/ 0 $ / ---' -
Scoateți etichetele html
sed -e 's /<[^>] *.// g ' -
Actualizați ereg în vechiul cod php pentru a rula în php7 sau mai târziu
sed 's / ereg (\ ([^,] * \).\ ([^)] * \)./ strpos (\ 2, \ 1) / g '
Verificați dacă sed este mai devreme decât o anumită versiune
sed -e 'v 4.5 ' -

Exemplu de versiune sed ramificare în bash

Mai sus în exemple, există o linie pentru a verifica dacă sed este mai devreme decât o anumită versiune pe care o putem folosi pentru a implementa ramificarea versiunii în bash, ceea ce cred că este mai ușor decât încercarea de a implementa o funcție pentru a compara numerele de versiune din ieșirea de versiune sed. Singura capcană este că, dacă există o versiune anterioară a sed care nu acceptă comanda v, atunci avem probleme.

Comenzi

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

try-version ()

echo -n "Versiunea $ 1. Bine. Fă-o ";
test-sed-version-at-most $ 1 &&
ecou -n „vechi”;
Adevărat
||
ecou -n "nou"
;
ecou "mod."

main ()

v local;
pentru v în 4.4,5;
do
versiunea de încercare $ v;
Terminat

principal

Ieșire

Versiunea 4.4. Bine. Fă-o la fel.
Versiunea 4.5. Bine. Fă-o în noul mod.

Rețineți că versiunea de sed care rulează pe mașina mea la introducerea acestor caractere este 4.4, care ar explica rezultatul de mai sus. De asemenea, în același timp, cea mai recentă versiune a gnu sed a fost 4.7, cu vreo 3 ani mai mare decât cel pe care îl am. Sedul meu este vechi! De fapt, în sed 4.0.6, a fost adăugat un parametru la comanda version, astfel încât această strategie funcționează pentru orice cel puțin v4.0.6, care este îngăduitor având în vedere că versiunea a fost lansată la începutul anului 2003. Esti bun.

Am făcut câteva săpături suplimentare, citind de fapt ȘTIRI din cel mai recent cod sursă. Versiunea 4.6 are o nouă caracteristică, -debug care aruncă scriptul și adnotează liniile de ieșire. Acest lucru vă va permite să traduceți scripturi sed generate de funcții în bash în formă canonică. Misto! Doar nu uitați că aveți nevoie de versiunea sed ramificare în bash. Aici intră în joc acest exemplu sed.

Exemplu de funcție bash folosind sed pentru a elimina etichetele HTML

În exemplele de mai sus există o linie pentru a elimina etichetele HTML. Să aruncăm asta într-o funcție bash și să o folosim pentru a elimina toate etichetele HTML din ultimul articol pe care l-am scris.

Comenzi

strip-tags ()

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

curl https: // linuxhint.com / bash_cut_command / --silent | etichete de benzi

Nu pot spune că este perfect, dar cel puțin este lizibil în terminal.

Exemple Sed cu fluxuri de lucru: Exemplu flux de lucru: înlocuiți în siguranță toate folosind find, grep și sed

Este sigur să spunem că modificările făcute folosind sed cu opțiunea -i sunt ireversibile. Asta dacă nu sunteți complet sigur ce text urmează să fie înlocuit, probabil că veți ajunge cu un caracter mai puțin decât intenționat. De aceea, în acest exemplu, vom folosi sed într-un flux de lucru pentru a înlocui în siguranță textul din toate fișierele pe care le-ați selectat.

Flux de lucru

  1. găsi
  2. grep
  3. sed
găsi

Aici veți selecta fișierele care urmează să fie înlocuite. Vă sugerez să utilizați o comandă de-a lungul acestor linii:

găsi -tip f -name | grep -v -e | xargs -i ..

De exemplu, poate doriți să limitați fișierele pentru a înlocui fișierele PHP, excluzând directoarele depozitului git, după cum urmează.

găsi -tip f -name \ *.php | grep -v -e '.git '| xargs -i ..

Citiți mai multe despre comanda xargs din bash.

grep

În continuare, vom încerca să potrivim some_pattern în fișierele selectate după cum urmează. Rețineți că, deoarece utilizăm opțiunea -o pentru grep, rezultatul va afișa șirul potrivit numai dacă există.

găsi -tip f -name \ *.php | grep -v -e '.git '|
xargs -i grep -e some_pattern -o

Comanda de mai sus ar trebui să returneze o listă de șiruri care se potrivesc cu some_pattern.

sed

În cele din urmă, vrem să înlocuim toate șirurile care se potrivesc cu some_pattern. Pentru a face acest lucru, trebuie să convertim grep în sed după cum urmează.

găsi -tip f -name \ *.php | grep -v -e '.git '|
xargs -i sed -i -e s / some_pattern / substitut / g

Comanda grep devine sed -i și opțiunea -o este eliminată. Și iată-l.

Acum puteți verifica în prealabil ce șiruri vor fi înlocuite în sed în loc să vă testați norocul.

Note finale despre opțiunile utilizate în exemple

Iată o listă de opțiuni utilizate în exemplele sed discutate pe scurt.

Opțiune Descriere
-eu Editați în loc. Dacă intrarea este un fișier (nu este introdus), rezultatul expresiilor va suprascrie conținutul fișierului.

Sed acceptă una

de ex. sed -n ..

-e -e înseamnă expresie. Parametrul său este o expresie în limbajul sed.

Sed acceptă multe

de exemplu) sed -e 'expr1' -e 'expr2' ..

-n Ascunde linia neafectată de expresie. Asta dacă expresia este o declarație de tipărire în limbajul sed, atunci liniile care nu sunt incluse în declarația de tipărire nu vor fi incluse în ieșire.

de ex. sed -n ..

Pentru mai multe despre opțiunile sed disponibile, consultați sed -help

Note de finalizare despre comenzi echivalente utilizate în exemple

Următoarele utilitare din linia de comandă sunt incluse în exemplele sed cu comenzi echivalente.

Notă finală pe final - de exemplu comenzi echivalente

În cazul în care vă întrebați ce se întâmplă personajul - în exemplu, această notă este pentru dvs. Am adăugat un caracter - după majoritatea comenzilor din exemple pentru a sugera că ne așteptăm ca intrarea să fie primită printr-o conductă. Acesta este,

cat some-file | sortare -R - | cap -1

Cu toate acestea, atunci când este prezentă comanda din stânga, putem omite indiciul după cum urmează.

cat some-file | sortează -R | cap -1

Asta se întâmpla cu caracterul - după comenzi din exemple.

Note finale privind funcțiile pentru configurare

În cazul în care căutați, aici sunt funcții pentru configurare pentru exemplele de mai sus. Rezultatul obținut folosind declare -f. Citiți mai multe despre comanda declare din bash pentru mai multe utilizări.

Comenzi

cuvinte ()

sec. 100

bar ()

ecou ---

vechi-php ()

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

Linia de fund

Mi-a plăcut să scriu exemple Bash sed și chiar am luat câteva trucuri suplimentare pe parcurs. Sed este un utilitar puternic pe linia de comandă și un limbaj expresiv pentru manipularea fișierelor text. Dacă ți-a plăcut să înveți despre sed, nu-ți face griji, mai sunt încă multe de atins. Sed on.

Battle For Wesnoth 1.13.6 Development Released
Battle For Wesnoth 1.13.6 released last month, is the sixth development release in the 1.13.x series and it delivers a number of improvements, most no...
Cum se instalează League Of Legends pe Ubuntu 14.04
Dacă ești fan al League of Legends, atunci aceasta este o oportunitate pentru tine de a testa rula League of Legends. Rețineți că LOL este acceptat pe...
Instalați cel mai recent joc de strategie OpenRA pe Ubuntu Linux
OpenRA este un motor de jocuri de strategie în timp real Libre / Free care recreează primele jocuri Westwood, cum ar fi clasicul Command & Conquer: Re...