când lucrați cu fișiere text, va trebui adesea să găsiți și să înlocuiți șiruri de text într-unul sau mai multe fișiere.
sed
este un editor de flux. Se poate efectua manipularea textului de bază pe fișiere și fluxuri de intrare, cum ar fi conducte. Cu sed
, puteți căuta, găsi și înlocui, insera și șterge cuvinte și linii. Acesta susține expresii regulate de bază și extinse care vă permit să potriviți modele complexe.,în acest articol, vom vorbi despre cum să găsim și să înlocuim șirurile cu sed
. De asemenea, vă vom arăta cum să efectuați o căutare recursivă și să o înlocuiți.
găsiți și înlocuiți șirul cu sed #
există mai multe versiuni ale sed
, cu unele diferențe funcționale între ele. macOS utilizează versiunea BSD, în timp ce majoritatea distribuțiilor Linux vin cu GNU sed
preinstalat în mod implicit. Vom folosi versiunea GNU.,
forma generală de căutarea și înlocuirea textului folosind sed
are următoarea formă:
sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
-
-i
– în mod implicit,sed
scrie său de ieșire la dispozitivul standard de ieșire. Această opțiune spunesed
pentru a edita fișiere în loc. Dacă este furnizată o extensie (ex-I.bak), se creează o copie de rezervă a fișierului original. -
s
– comanda de substituție, probabil cea mai utilizată comandă din sed. -
/ / /
– caracter Delimitator., Poate fi orice caracter, dar de obicei este folosit caracterul slash (/
). -
SEARCH_REGEX
– șir Normal sau o expresie regulată pentru a căuta. -
REPLACEMENT
– șirul de înlocuire. -
g
– pavilion de înlocuire la nivel mondial. În mod implicit,sed
citește fișier linie cu linie și modificări numai prima apariție aSEARCH_REGEX
pe o linie. Când este furnizat steagul de înlocuire, toate evenimentele sunt înlocuite., -
INPUTFILE
– numele fișierului pe care doriți să rulați comanda.
este o practică bună să puneți ghilimele în jurul argumentului, astfel încât meta-caracterele shell să nu se extindă.
Să vedem cum putem folosi comanda sed
pentru a căuta și înlocui textul în fișiere cu unele dintre cele mai utilizate opțiuni și steaguri.
în scopuri demonstrative, vom folosi următorul fișier:
123 Foo foo foo foo /bin/bash Ubuntu foobar 456
g
flag este omis, doar primul exemplu de șir de căutare în fiecare linie se înlocuiește cu:
sed -i 's/foo/linux/' file.txt
123 Foo linux foo linux /bin/bash Ubuntu foobar 456
Cu globală de înlocuire steag sed
înlocuiește toate aparițiile de căutare model:
sed -i 's/foo/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu linuxbar 456
Ca s-ar putea să fi observat, subșirul foo
în foobar
string este, de asemenea, înlocuit în exemplul anterior., Dacă acesta nu este comportamentul dorit, utilizați expresia limită a cuvântului (\b
) la ambele capete ale șirului de căutare. Acest lucru asigură cuvintele parțiale nu sunt potrivite.
sed -i 's/\bfoo\b/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu foobar 456
Pentru a face modelul meci majuscule, utilizați I
pavilion., În exemplul de mai jos sunt folosind ambele g
și I
steaguri:
sed -i 's/foo/linux/gI' file.txt
123 linux linux linux linux /bin/bash Ubuntu linuxbar 456
Dacă doriți să găsi și înlocui un șir de caractere care conține delimitator caracter (/
) veți avea nevoie pentru a utiliza backslash (\
) pentru a scăpa de slash. De exemplu, pentru a înlocui /bin/bash
cu /usr/bin/zsh
v-ar folosi
sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt
mai ușor și mult mai ușor de citit opțiune este de a utiliza un alt caracter delimitator., Cei mai mulți oameni folosesc bara verticală (|
) sau colon (:
), dar puteți folosi orice alt caracter:
sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt
123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456
de asemenea, puteți utiliza expresii regulate. De exemplu, pentru a căuta toate 3 cifre și să le înlocuiască cu șirul number
v-ar folosi:
sed -i 's/\b\{3\}\b/number/g' file.txt
number Foo foo foo foo /bin/bash demo foobar number
o Altă caracteristică utilă de sed este că puteți folosi caracterul and &
care corespunde model potrivit., Caracterul poate fi folosit de mai multe ori.
De exemplu, dacă doriți să adăugați acolade {}
în jurul valorii de fiecare număr de 3 cifre, de tip:
sed -i 's/\b\{3\}\b/{&}/g' file.txt
{123} Foo foo foo foo /bin/bash demo foobar {456}
Ultimul, dar nu cel mai puțin, este întotdeauna o idee bună de a face o copie de rezervă când editați un fișier cu sed
. Pentru a face acest lucru, trebuie doar să furnizați o extensie pentru fișierul de rezervă la opțiunea -i
., De exemplu, pentru a edita file.txt
și de a salva fișierul original ca file.txt.bak
v-ar folosi:
sed -i.bak 's/foo/linux/g' file.txt
Pentru a asigurați-vă că de rezervă este creat, lista de fișiere cu ls
command:
ls
file.txt file.txt.bak
Recursiv Găsi și Înlocui #
Uneori, poate doriți să recursiv directoare de căutare pentru fișiere care conțin un șir de caractere și înlocuiește șirul în toate fișierele., Acest lucru poate fi realizat folosind comenzi, cum ar fi find
sau grep
pentru a recursiv a găsi fișiere în directorul și conducte numele de fișier pentru sed
.
următoarea comandă va căuta recursiv fișierele din Directorul de lucru curent și va transmite numele fișierelor la sed
.,
find . -type f -exec sed -i 's/foo/bar/g' {} +
Pentru a evita problemele cu fișierele care conțin spațiu în numele lor, utilizați -print0
opțiune, care spune find
pentru a imprima numele de fișier, urmat de un caracter nul și conducta de ieșire a sed
cu ajutorul xargs -0
:
find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'
Pentru a exclude un director, utilizați -not -path
opțiune.,multă artă cu dot (.
), utilizare:
find . -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'
Dacă doriți pentru a căuta și înlocui text numai pe fișierele cu o anumită extensie, va utiliza:
find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'
o Altă opțiune este de a utiliza grep
comandă pentru a recursiv a găsi toate fișierele care conțin modelul de căutare și apoi conducta de nume de fișiere pentru sed
:
grep -rlZ 'foo' . | xargs -0 sed -i.bak 's/foo/bar/g'
Concluzie #
Deși poate părea complicat și complex, în primul rând, de căutare și înlocui text în fișiere cu sed
este foarte simplu.,
Pentru a afla mai multe despre sed
comenzi, opțiuni, și steaguri, vizitați GNU sed manual și Grymoire sed tutorial .
Leave a Reply