Android

Cum să utilizați sed pentru a găsi și înlocui șirul în fișiere

Taking the mystery out of the "tar" command: Create, extract and compress archives easily | Bash #8

Taking the mystery out of the "tar" command: Create, extract and compress archives easily | Bash #8

Cuprins:

Anonim

Destul de des atunci când lucrați cu fișiere text, va trebui să găsiți și să înlocuiți șiruri de text într-unul sau mai multe fișiere.

sed este un lucru foarte important. 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. Acceptă expresii regulate de bază și extinse care vă permit să potriviți tipare complexe.

, vom vorbi despre cum puteți găsi și înlocui șirurile cu sed . Vă vom arăta, de asemenea, 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 de sed , cu unele diferențe funcționale între ele. macOS folosește versiunea BSD și majoritatea distribuțiilor Linux vin cu GNU sed preinstalate implicit. Vom folosi versiunea GNU.

Forma generală de căutare și înlocuire a textului folosind sed are următoarea formă:

sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE

  • -i - În mod implicit sed își scrie ieșirea la ieșirea standard. Această opțiune spune sed să editeze fișierele în loc. Dacă este furnizată o extensie (ex-i.bak), se va crea o copie de rezervă a fișierului original. s - Comanda înlocuitoare, probabil cea mai folosită comandă în sed. / / / - Caracter delimitator. Poate fi orice caracter, dar de obicei se folosește caracterul slash ( / ). SEARCH_REGEX - Șir normal sau expresie obișnuită de căutat. REPLACEMENT - șirul de înlocuire. g - Steagul global de înlocuire. În mod implicit, sed citește fișierul rând cu linie și schimbă doar prima apariție a SEARCH_REGEX pe o linie. Când este furnizat steagul de înlocuire, toate evenimentele vor fi î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 exemple despre modul de utilizare a comenzii sed pentru a căuta și înlocui text în fișiere cu unele dintre cele mai utilizate opțiuni și steaguri.

În scop demonstrativ, vom folosi următorul fișier:

fisier.txt

123 Foo foo foo foo /bin/bash Ubuntu foobar 456

sed -i 's/foo/linux/' file.txt

123 Foo linux foo linux /bin/bash Ubuntu foobar 456

Cu steagul global de înlocuire, sed înlocuiește toate aparițiile modelului de căutare:

sed -i 's/foo/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu linuxbar 456

După cum ați observat, în exemplul precedent se înlocuiește și subcentrul foo din șirul foobar . Dacă acesta nu este comportamentul dorit, utilizați expresia cuvânt-delimitare ( \b ) la ambele capete ale șirului de căutare. Aceasta asigură că nu se potrivesc cuvintele parțiale.

sed -i 's/\bfoo\b/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu foobar 456

Pentru a face sensibilă a cazului de potrivire a modelului, folosiți steagul I În exemplul de mai jos folosim atât steagurile g și I :

sed -i 's/foo/linux/gI' file.txt

123 linux linux linux linux /bin/bash Ubuntu linuxbar 456

sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt

Opțiunea mai ușoară și mult mai ușor de citit este să folosești un alt caracter delimitator. Majoritatea oamenilor folosesc bara verticală ( | ) sau colon (:), dar puteți utiliza 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

Puteți utiliza, de asemenea, expresii obișnuite. De exemplu, pentru a căuta în toate numerele de 3 cifre și a le înlocui cu number șir pe care l-ați 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ă a sed este că puteți utiliza caracterul ampersand & care corespunde modelului potrivit. Personajul poate fi folosit de mai multe ori.

De exemplu, dacă doriți să adăugați bretele ondulate {} jurul fiecărui număr de 3 cifre, tastați:

sed -i 's/\b\{3}\b/{&}/g' file.txt

{123} Foo foo foo foo /bin/bash demo foobar {456}

Nu în ultimul rând, este întotdeauna o idee bună să faceți o copie de rezervă atunci când editați un fișier cu sed . Pentru a face asta, trebuie doar să oferiți o extensie la opțiunea -i . De exemplu, pentru a edita fișierul.txt și a salva fișierul original ca file.txt.bak ați utiliza:

sed -i.bak 's/foo/linux/g' file.txt

ls

file.txt file.txt.bak

Găsiți și înlocuiți recursiv

Uneori doriți să căutați în mod recursiv directoare pentru fișierele care conțin un șir și să înlocuiți șirul în toate fișierele. Acest lucru se poate face folosind comenzi precum find sau grep pentru a găsi recursiv fișierele din director și canalizarea numelor de fișiere pentru sed .

Următoarea comandă va căuta recursiv fișierele din directorul de lucru curent și va trece numele fișierelor în 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, folosiți opțiunea -print0 care spune că find să imprimați numele fișierului, urmată de un caracter nul și -print0 ieșirea la sed folosind xargs -0 :

find. -type f -print0 | xargs -0 sed -i 's/foo/bar/g'

Pentru a exclude un director, utilizați opțiunea -not -path . De exemplu, dacă înlocuiți un șir din repertoriul local git pentru a exclude toate fișierele care încep cu punct ( . ), Utilizați:

find. -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'

find. -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'

O altă opțiune este să utilizați comanda grep pentru a găsi recursiv toate fișierele care conțin modelul de căutare și apoi să sed numele fișierelor pentru a sed :

grep -rlZ 'foo'. | xargs -0 sed -i.bak 's/foo/bar/g'

Concluzie

Deși poate părea complicat și complex, la început căutarea și înlocuirea textului în fișiere cu sed este foarte simplă.

Pentru a afla mai multe despre comenzile sed , opțiunea și steagurile, accesați manualul GNU sed și tutorialul Grymoire sed. Dacă aveți întrebări sau feedback, nu ezitați să lăsați un comentariu.

sed terminal