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
.
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:
OutputCopyright (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:
OutputCopyright (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:
OutputCopyright (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
OutputCopyright (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:
OutputCopyright (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:
OutputCopyright (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,
OutputCopyright (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:
OutputAll 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:
OutputAll 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:
Outputsed: -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:
Outputthis 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:
Outputthis 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:
Outputthis 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:
Outputyes, 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,
Outputthis 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.