Bash Sed Exemple

Bash Sed Examples



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 configurare pentru exemplu, pe care voi încerca să nu-l fac prea exagerat.







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



bareste un fișier text care conține o singură linie -.



vechi-phpeste un fișier text care conține linii de PHP vechi care se vor rupe în php7 sau mai târziu. (Sugestie: 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 pentru 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 prezentate î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 într-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 -Și „s / 0 // g”-

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

sed -Și „s /, / t / g”-

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

sed „$ a ---”-

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

sed „1i ---”-

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

sed -n -Și „p”-

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

sed -n -Și „/ ^ 1 / p”-

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

sed -Și „/ ^ 1 / d”-

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

sed -n -Și '$ ='-

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

sed 'în{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 de tee. Ei bine, este. Aici vom dezvălui cum să implementăm o funcție care să înlocuiască tee în bash folosind sed.

Comenzi

tee ()
{
Test $ {#} -eq 1 || întoarcere;
sed 'în{1} $'-
}
principal()
teeacest;
pisicăacest

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. Prima 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ţielc()
{
sed -n -Și '$ ='-
};
funcţielinie de imprimare()
{
sed -n -Și '{1} $p '-
};
temp= $( mktemp );
pisică-> $ {temp};
pisică $ {temp} |linie de tipar $((ALEATORIU%$( pisică $ {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/ --tăcut |etichete de benzi|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, cap, coadă 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|linie de imprimarecincizeci

Ieșire

cincizeci

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

Comenzi

declara -xfcuvinte
declara -xflinie de imprimare
sec 1 10$(cuvinte| toaleta -la ) | xargs-ibash -c 'cuvinte | linie de imprimare {} '

Ieșire

1
unsprezece
douăzeci și unu
31
41
51
61
71
81
91

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

Exemple 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 -Și „s / ^ / # /”-
Ștergeți prima linie
sed -Și „1d”-
Ștergeultimullinia
sed -Și „$ 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 -Și „s /†*.// g”-
Upgrade eregînvechi cod PHP pentru a rulaînphp7 sau o versiune ulterioară
sed 's / ereg ( ([^,] * ). ([^)] * ) ./ strpos ( 2, 1) / g'
Verificadacă sedeste mai devreme decât o anumită versiune
sed -Și „v 4.5”-

Exemplu ramificare versiune sed î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() {
aruncat -n | sed 'v{1} $'-2> /dev/nul
}
versiunea de încercare()
{
aruncat -n 'Versiune{1} $. Bine. Fă asta;
test-sed-version-at-most{1} $ && {
aruncat -n 'vechi';
Adevărat
} || {
aruncat -n 'nou'
};
aruncat ' cale.'
}
principal()
{
localv;
pentruvîn 4.{4,5};
do
versiunea de încercare$ {v};
Terminat
}
principal

Ieșire

Versiune4.4. Bine. Fă-o la fel.
Versiune4.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, ceea ce ar explica rezultatul de mai sus. De asemenea, în același timp, cea mai recentă versiune a gnu sed a fost de 4,7, cu aproximativ 3 ani mai veche decât cea pe care o am. Sedul meu este vechi! De fapt, în sed 4.0.6, a fost adăugat un parametru la comanda versiune, astfel încât această strategie funcționează pentru orice menționat cel puțin v4.0.6, care este îngăduitor având în vedere că versiunea a fost lansată la începutul anului 2003. Ești bun.

Am făcut câteva săpături suplimentare, de fapt citind Ș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 scripturile sed generate de funcții în bash în formă canonică. Misto! 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

etichete de benzi()
{
sed -Și „s /†*.// g”-
}
curl https://linuxhint.com/bash_cut_command/ --tăcut |etichete de benzi

Nu pot spune că este perfect, dar cel puțin poate fi citit î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. prindere
  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 -tipf-Nume | prindere -v-Și| 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 -tipf-Nume*.php| prindere -v -Și '.merge' | xargs -i...

Citiți mai multe despre comanda xargs din bash.

prindere

Î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 doar dacă există.

găsi -tipf-Nume*.php| prindere -v -Și '.merge' |
xargs -i prindere -Șisome_pattern-sau

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 -tipf-Nume*.php| prindere -v -Și '.merge' |
xargs -i sed -i -Șis/some_pattern/înlocuire/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
-i Editați în loc. Dacă intrarea este un fișier (nu este introdus), rezultatul expresiilor va suprascrie conținutul fișierului.

Sed acceptă unul

de ex. sed -n ...

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

Sed acceptă multe

de ex. sed -e'expr1 '-e'expr2'

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

de ex. sed -n ...

Pentru mai multe despre opțiunile disponibile pentru sed, 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.

  • fel
  • cap
  • coadă
  • prindere
  • pisică
  • NS
  • tee

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,

pisicăunele-dosar| fel -R-| cap -1

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

pisicăunele-dosar| fel -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()
{
aruncat ---
}
vechi-php()
{
aruncat '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.