Welcome to Our Website

Elementele de Bază ale Folosind Sed Stream Editor pentru a Manipula Text în Linux

Introducere

sed comanda, scurt pentru stream editor, efectuează operații de editare text provenind de la intrarea standard sau un fișier. sed editează linie cu linie și într-un mod non-interactiv.aceasta înseamnă că luați toate deciziile de editare pe măsură ce apelați comanda și sed execută automat instrucțiunile., Acest lucru poate părea confuz sau neintuitiv, dar este un mod foarte puternic și rapid de a transforma textul, mai ales ca parte a unui script sau a unui flux de lucru automatizat.acest tutorial va acoperi câteva operații de bază și vă va prezenta sintaxa necesară pentru a opera acest editor. Aproape sigur nu veți înlocui niciodată editorul de text obișnuit cu sed, dar probabil va deveni un plus binevenit pentru caseta de instrumente de editare a textului.

Notă: Acest tutorial utilizează versiunea GNU a sed găsită pe Ubuntu și alte sisteme de operare Linux., Dacă utilizați macOS, veți avea versiunea BSD care are diferite opțiuni și argumente. Puteți instala versiunea GNU a sed cu Homebrew folosind brew install gnu-sed.

lansați un Terminal interactiv!

utilizare de bază

sed funcționează pe un flux de text care se citește fie dintr-un fișier text sau de la intrare standard (STDIN). Aceasta înseamnă că puteți trimite ieșirea unei alte comenzi direct în sed pentru editare sau puteți lucra la un fișier pe care l-ați creat deja.,

ar trebui să fie, de asemenea, conștienți de faptul că sed ieșiri totul la standard out (STDOUT) în mod implicit. Asta înseamnă că, dacă nu este redirecționat, sed va imprima ieșirea pe ecran în loc să o salveze într-un fișier.

utilizarea de bază este:

  • sed commands

În acest tutorial, veți utiliza o copie a BSD de Licență pentru Software de a experimenta cu sed., Pe Ubuntu, executați următoarele comenzi pentru a copia licenței BSD fișierul în directorul tau de casa, astfel încât să puteți lucra cu ea:

  • cd
  • cp /usr/share/common-licenses/BSD .

Dacă nu aveți o copie locală a licenței BSD, creați unul singur cu această comandă:

  • cat << 'EOF' > BSD
  • Copyright (c) The Regents of the University of California.
  • All rights reserved.
  • Redistribution and use in source and binary forms, with or without
  • modification, are permitted provided that the following conditions
  • are met:
  • 1. Redistributions of source code must retain the above copyright
  • notice, this list of conditions and the following disclaimer.
  • 2. Redistributions in binary form must reproduce the above copyright
  • notice, this list of conditions and the following disclaimer in the
  • documentation and/or other materials provided with the distribution.
  • 3. Neither the name of the University nor the names of its contributors
  • may be used to endorse or promote products derived from this software
  • without specific prior written permission.
  • THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  • ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  • IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  • ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  • FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  • DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  • OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  • HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  • LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  • OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  • SUCH DAMAGE.
  • EOF

Să folosim sed pentru a vizualiza conținutul de licență BSD fișier. sed trimite rezultatele sale pe ecran în mod implicit, ceea ce înseamnă că îl puteți folosi ca cititor de fișiere, trecând fără comenzi de editare., Încercați de a executa următoarea comandă:

  • sed '' BSD

Veți vedea licența BSD afișat pe ecran:

Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.......

single citate conțin comenzi de editare treci la sed. În acest caz, nu ați trecut nimic, așa că sed a imprimat fiecare linie pe care a primit-o la ieșirea standard.

sed poate utiliza intrare standard, mai degrabă decât un fișier., Conducta de ieșire a cat comandă în sed pentru a produce același rezultat:

  • cat BSD | sed ''

Veți vedea de ieșire de fișier:

Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.. . .. . .

după Cum puteți vedea, puteți opera pe fișiere sau fluxuri de text, cum ar fi cele produse atunci când tubulatura de ieșire cu țeavă (|) personaj, la fel de ușor.

Imprimare Linii

În exemplul anterior, ați văzut că de intrare a trecut în sed fără orice operațiuni ar imprima rezultatele direct la ieșirea standard.,

Să exploreze sed‘s explicite print comandă, pe care le specifica, cu ajutorul p personaj în ghilimele simple.

Executa următoarea comandă:

  • sed 'p' BSD

Veți vedea fiecare linie a BSD file tipărite de două ori:

Output
Copyright (c) The Regents of the University of California.Copyright (c) The Regents of the University of California.All rights reserved.All rights reserved.Redistribution and use in source and binary forms, with or withoutRedistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsmodification, are permitted provided that the following conditionsare met:are met:. . .. . .

sed tipărește automat fiecare linie implicit, și atunci am spus-o pentru a imprima linii explicit cu „p” de comandă, astfel încât să obțineți fiecare linie imprimată de două ori.,

dacă examinați îndeaproape ieșirea, veți vedea că are prima linie de două ori, urmată de a doua linie de două ori, etc, care vă spune că sed funcționează pe linie de date cu linie. Citește o linie, operează pe ea și scoate textul rezultat înainte de a repeta procesul pe linia următoare.

puteți curăța rezultate prin trecerea -n opțiunea de a sed, care suprimă automat de imprimare:

  • sed -n 'p' BSD
Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.. . .. . .

Avem acum sunt din nou să imprimați fiecare linie o dată.,exemplele de până acum nu pot fi considerate editare (decât dacă doriți să imprimați fiecare linie de două ori…). Apoi, veți explora modul în care sed poate modifica ieșirea vizând anumite secțiuni ale datelor text.

folosind intervale de adrese

adresele vă permit să vizați anumite părți ale unui flux de text. Puteți specifica o anumită linie sau chiar o serie de linii.

să avem sed imprimați prima linie a fișierului., Executați următoarea comandă:

  • sed -n '1p' BSD

prima linie de amprente pe ecran:

Output
Copyright (c) The Regents of the University of California.

Prin plasarea numărul 1 inainte de a comanda print, ai spus sed numărul de linie să-l opereze. Puteți imprima cu ușurință cinci linii (nu uita „-n”):

  • sed -n '1,5p' BSD

Veți vedea această ieșire:

Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditions

– Ai dat un interval de adrese pentru sed., Dacă dați sed o adresă, aceasta va efectua numai comenzile care urmează pe acele linii. În acest exemplu, le-ați spus sed pentru a imprima linia 1 prin linia 5. Ai putea avea specificat acest lucru într-un mod diferit, oferindu-prima adresă și apoi, folosind un offset de a spune sed cât de multe linii suplimentare pentru a călători, astfel:

  • sed -n '1,+4p' BSD

Acest lucru va duce la același rezultat, pentru că i-ai spus sed pentru a începe de la linia 1 și apoi funcționează pe următoarele 4 linii la fel de bine.,

Dacă doriți să imprimați orice altă linie, specificați intervalul după caracterul ~. Urmatoarea comanda printuri de orice altă linie în BSD fișier, începând cu linia 1:

  • sed -n '1~2p' BSD

Iată de ieșire veți vedea,

Output
Copyright (c) The Regents of the University of California.modification, are permitted provided that the following conditions1. Redistributions of source code must retain the above copyright2. Redistributions in binary form must reproduce the above copyright documentation and/or other materials provided with the distribution. may be used to endorse or promote products derived from this software. . .. . .

puteți folosi sed pentru a șterge textul din ieșire, precum și.,

Ștergerea Textului

puteți efectua text ștergerea unde anterior au fost specificarea de imprimare a textului prin schimbarea p comanda d comandă.

În acest caz, nu mai este nevoie -n comandă pentru sed va imprima tot ceea ce nu este șters. Acest lucru vă va ajuta să vedeți ce se întâmplă.,

Modifica ultima comandă din secțiunea anterioară pentru a face
șterge fiecare rând începând cu primul:

  • sed '1~2d' BSD

rezultatul este că vezi tu fiecare linie nu s-au dat ultimul timp:

Output
All rights reserved.Redistribution and use in source and binary forms, with or withoutare met: notice, this list of conditions and the following disclaimer. notice, this list of conditions and the following disclaimer in the3. Neither the name of the University nor the names of its contributors without specific prior written permission.. . .. . .

este important să menționăm aici că sursa noastră de fișier nu este afectată. Este încă intact. Editările sunt trimise pe ecranul nostru.,

Dacă dorim să salvăm modificările, putem redirecționa standard de ieșire într-un fișier astfel:

  • sed '1~2d' BSD > everyother.txt

Acum deschideți fișierul cu cat:

  • cat everyother.txt

Veți vedea același ieșire pe care ai văzut-o pe ecran anterior:

Output
All rights reserved.Redistribution and use in source and binary forms, with or withoutare met: notice, this list of conditions and the following disclaimer. notice, this list of conditions and the following disclaimer in the3. Neither the name of the University nor the names of its contributors without specific prior written permission.. . .. . .

sed comanda nu editați fișierul sursă în mod implicit, dar puteți schimba acest comportament prin trecerea -i opțiune, care înseamnă „a efectua modificări în loc.”Aceasta va modifica fișierul sursă.,

atenție: utilizarea comutatorului -i va suprascrie fișierul original, deci ar trebui să îl utilizați cu grijă. Efectua operațiuni fără -i comutați mai întâi și apoi executați din nou comanda cu -i odată ce ai ceea ce vrei, de a crea o copie de rezervă a fișierului original, sau redirecționa ieșire într-un fișier. Este foarte ușor să modificați accidental fișierul original cu comutatorul -i.

să-l încercați prin editareaeveryother.txt fișierul pe care tocmai ați creat, în loc., Să reducă și mai mult de fișiere de ștergerea de orice altă linie
din nou:

  • sed -i '1~2d' everyother.txt

Dacă utilizați cat pentru a afișa fișierul cu cat everyother.txt, veți vedea că fișierul a fost editat.

opțiunea -i poate fi periculoasă. Din fericire, sed vă oferă posibilitatea de a crea un fișier de rezervă înainte de editare.,

Pentru a crea un fișier de backup înainte de editare, se adaugă extensie backup direct după „-mi” opțiune:

  • sed -i.bak '1~2d' everyother.txt

Acest lucru creează un fișier de backup cu .bak extensie, și apoi editează fișierul original în loc.

în continuare vă veți uita la modul de utilizare sed pentru a efectua operațiuni de căutare și înlocuire.poate cea mai cunoscută utilizare pentru sed este înlocuirea textului., sed poate căuta modele de text folosind expresii obișnuite, apoi poate înlocui textul găsit cu altceva.

puteți afla mai multe despre expresiile regulate urmând utilizarea expresiilor regulate Grep pentru a căuta modele de Text în Linux.

În forma sa de bază, puteți schimba un cuvânt cu alt cuvânt, folosind următoarea sintaxă:

's/old_word/new_word/'

s este substitut de comandă. Cele trei slash-uri (/) sunt folosite pentru a separa diferitele câmpuri de text., Puteți utiliza alte caractere pentru a delimita câmpurile dacă ar fi mai util.

de exemplu, dacă ați încercat să schimbați numele unui site web, utilizarea unui alt delimitator ar fi util, deoarece adresele URL conțin slash-uri.

Executați următoarea comandă pentru a imprima un URL cu echo și modificați-l cu sed, folosind subliniere (_) personajul ca delimitator:

  • echo "http://www.example.com/index.html" | sed 's_com/index_org/home_'

Acesta înlocuiește com/index cu org/home., La ieșire arată modifed URL:

Output

Do not forget the final delimiter, or sed will complain. If you ran this command:

  • echo "http://www.example.com/index.html" | sed 's_com/index_org/home'

Veți vedea această ieșire:

Output
sed: -e expression #1, char 20: unterminated `s' command

Să creați un fișier nou de a practica unele substituții. Executați următoarea comandă pentru a crea un nou fișier text numit song.txt:

  • echo "this is the song that never ends
  • yes, it goes on and on, my friend
  • some people started singing it
  • not knowing what it was
  • and they'll continue singing it forever
  • just because..." > song.txt

Acum să înlocuiască expresia on cu forward. Utilizați următoarea comandă:

  • sed 's/on/forward/' song.txt

ieșire arată astfel:

Output
this is the sforwardg that never endsyes, it goes forward and on, my friendsome people started singing itnot knowing what it wasand they'll cforwardtinue singing it foreverjust because...

puteți vedea câteva lucruri notabile aici., În primul rând, este că sed modele înlocuite, nu cuvinte. on în song este schimbat la forward.un alt lucru de observat este că pe linia 2, al doilea on nu a fost schimbat la forward.

Acest lucru este pentru că, în mod implicit, s comandă operează pe primul meci într-o linie și apoi se mută la următoarea linie., Pentru a face sed înlocuiți la fiecare instanță de on în loc de prima de pe fiecare linie, trebuie să treacă un opțional drapelul de substitut de comandă.

Oferim g drapelul de substitut comanda prin plasarea acesteia după înlocuire set:

  • sed 's/on/forward/g' song.txt

Veți vedea această ieșire:

Output
this is the sforwardg that never endsyes, it goes forward and forward, my friendsome people started singing itnot knowing what it wasand they'll cforwardtinue singing it foreverjust because...

Acum substitut de comandă se schimbă în fiecare exemplu.,

Dacă ai vrut doar pentru a schimba cel de-al doilea exemplu de „pe”, care sed găsește pe fiecare linie, atunci ar trebui să utilizați numărul 2 în loc de g:

  • sed 's/on/forward/2' song.txt

de Această dată, celelalte linii sunt de neschimbat, deoarece nu au un al doilea eveniment:

Output
this is the song that never endsyes, it goes on and forward, my friendsome people started singing itnot knowing what it wasand they'll continue singing it foreverjust because...

Dacă doriți să vedeți numai liniile care au fost înlocuite, folosiți -n opțiune din nou pentru a suprima imprimarea automată.,

puteți trece apoi opțiunea p la comanda substitut pentru a imprima linii unde a avut loc substituirea.

  • sed -n 's/on/forward/2p' song.txt

linia asta s-a schimbat amprente pe ecran:

Output
yes, it goes on and forward, my friend

după Cum puteți vedea, puteți combina steaguri la sfârșitul comenzii.

dacă doriți ca procesul de căutare să ignore cazul, îl puteți transmite cu steagul „i”.,

  • sed 's/SINGING/saying/i' song.txt

Iată de ieșire veți vedea,

Output
this is the song that never endsyes, it goes on and on, my friendsome people started saying itnot knowing what it wasand they'll continue saying it foreverjust because...

Înlocuirea și Corelarea Potrivit Textului

Dacă doriți să găsiți mai multe modele complexe cu expresii regulate, aveți un număr de diferite metode de corelarea model potrivit în textul de înlocuire.,

De exemplu, pentru a se potrivi de la începutul liniei de at, utilizați următoarea comandă:

  • sed 's/^.*at/REPLACED/' song.txt

Veți vedea această ieșire:

Output
REPLACED never endsyes, it goes on and on, my friendsome people started singing itREPLACED it wasand they'll continue singing it foreverjust because...

puteți vedea că wildcard expresie meciuri de la începutul liniei de la ultimul exemplu de at.

deoarece nu știți Fraza exactă care se va potrivi în șirul de căutare, puteți utiliza caracterul& pentru a reprezenta textul potrivit în șirul de înlocuire.,

Să punem între paranteze în jurul potrivite textului:

  • sed 's/^.*at/(&)/' song.txt

Veți vedea această ieșire:

Output
(this is the song that) never endsyes, it goes on and on, my friendsome people started singing it(not knowing what) it wasand they'll continue singing it foreverjust because...

Un mod mai flexibil de referențiere potrivit textului este de a utiliza scăpat paranteze pentru a grupa secțiuni de potrivire text.fiecare grup de text de căutare marcat cu paranteze poate fi referit printr-un număr de referință scăpat. De exemplu, prima paranteze grup pot fi referite cu \1, cel de-al doilea cu \2 și așa mai departe.,

În acest exemplu, vom schimba în primele două cuvinte din fiecare linie:

  • sed 's/\(*\) \(*\)/\2 \1/' song.txt

Veți vedea această ieșire:

Output
is this the song that never endsyes, goes it on and on, my friendpeople some started singing itknowing not what it wasthey and'll continue singing it foreverbecause just...

după Cum puteți vedea, rezultatele nu sunt perfecte. De exemplu, a doua linie omite primul cuvânt, deoarece are un caracter care nu este listat în setul nostru de caractere. În mod similar, a tratat they'll ca două cuvinte în a cincea linie.

Să îmbunătățească expresie regulată pentru a fi mai precis:

  • sed 's/\(*\) \(*\)/\2 \1/' song.txt

Veți vedea această ieșire:

Output
is this the song that never endsit yes, goes on and on, my friendpeople some started singing itknowing not what it wasthey'll and continue singing it foreverbecause... just

Acest lucru este mult mai bine decât ultima dată., Aceasta grupează punctuația cu cuvântul asociat.

observați cum repetăm expresia din paranteze (o dată fără caracterul * și apoi o dată cu acesta). Acest lucru este pentru că * caracter meciuri setul de caractere care vine înainte de a zero sau mai multe ori. Acest lucru înseamnă că meciul cu wildcard ar fi considerat un „meci”, chiar dacă modelul nu este găsit.pentru a vă asigura că sed găsește textul cel puțin o dată, trebuie să îl potriviți o dată fără wildcard înainte de a utiliza wildcard-ul.,

concluzie

în acest tutorial ați explorat comanda sed. Ați imprimat linii specifice din fișier, ați căutat text, ați șters linii, ați suprascris fișierul original și ați folosit expresii regulate pentru a înlocui textul. Ar trebui să puteți vedea deja cum puteți transforma rapid un document text folosind comenzi sed construite corect.

în următorul articol din această serie, veți explora câteva funcții mai avansate.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *