Android

Kako pomoću sed pronaći i zamijeniti niz u datotekama

Data Visualization and D3 by David Chouinard

Data Visualization and D3 by David Chouinard

Sadržaj:

Anonim

Prilikom rada s tekstualnim datotekama često ćete morati pronaći i zamijeniti nizove teksta u jednoj ili više datoteka.

sed je s tream ed itor. Može izvesti osnovnu manipulaciju tekstom na datotekama i ulaznim tokovima, kao što su cjevovodi. Pomoću sed možete pretraživati, pronaći i zamijeniti, umetnuti i brisati riječi i retke. Podržava osnovne i proširene regularne izraze koji vam omogućuju podudaranje složenih obrazaca.

, razgovarat ćemo o tome kako pronaći i zamijeniti žice sed . Također ćemo vam pokazati kako izvršiti rekurzivnu pretragu i zamjenu.

Pronađite i zamijenite žicu sed

Postoji nekoliko verzija sed , s nekim funkcionalnim razlikama među njima. macOS koristi BSD verziju, a većina Linux distribucija dolazi s GNU sed unaprijed zadanom instaliranom. Koristit ćemo GNU verziju.

Opći oblik pretraživanja i zamjene teksta pomoću sed ima sljedeći oblik:

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

  • -i - Zadano sed piše svoj izlaz na standardni izlaz. Ova opcija kaže sed da uređuje datoteke na svom mjestu. Ako se isporuči proširenje (ex -i.bak), stvorit će se sigurnosna kopija izvorne datoteke. s - Naredba za zamjenu, vjerojatno najkorištenija naredba u sed. / / / - znak razgraničenja. To može biti bilo koji znak, ali obično se koristi crta ( / ) znak. SEARCH_REGEX - Uobičajeni niz ili uobičajeni izraz za traženje. REPLACEMENT - zamjenski niz. g - Globalna zamjenska zastava. sed po zadanom čita datoteku po red i mijenja samo prvu pojavu SEARCH_REGEX na retku. Kada se omogući zamjenska zastava, sve pojave bit će zamijenjene. INPUTFILE - Naziv datoteke na kojoj želite pokrenuti naredbu.

Dobra je praksa da se argumenti stavljaju oko argumenata kako se meta-znakovi ljuske neće proširiti.

Pogledajmo primjere kako se pomoću naredbe sed traži i zamjenjuje tekst u datotekama s nekim od najčešće korištenih opcija i zastava.

U demonstrativne svrhe koristit ćemo sljedeću datoteku:

file.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

Globalna zamjenska zastava zamjenjuje sve pojave uzorka pretraživanja:

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

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

Kao što ste možda primijetili, u prethodnom primjeru također se zamjenjuje foobar niz unutar foobar niza. Ako to nije željeno ponašanje, upotrijebite izraz word-boundery ( \b ) na oba kraja niza pretraživanja. Ovo osigurava da se djelomične riječi ne podudaraju.

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

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

Da bi slučaj podudaranja uzoraka bio neosjetljiv, upotrijebite zastavicu I U primjeru u nastavku koristimo i g i I zastave:

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

Lakša i mnogo čitljivija opcija je upotreba drugog znaka za razgraničenje. Većina ljudi koristi okomitu traku ( | ) ili dvotočku (:), ali možete koristiti bilo koji drugi znak:

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

123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456

Možete koristiti i regularne izraze. Na primjer za pretraživanje svih trima znamenki i zamijenite ih s nizom number koji biste koristili:

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

number Foo foo foo foo /bin/bash demo foobar number

Još jedna korisna značajka sed je da možete koristiti znak ampersand & koji odgovara podudarnom obrascu. Znak se može koristiti više puta.

Na primjer, ako želite dodati kovrčave zagrade {} oko svakog troznamenkastog broja, upišite:

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

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

I posljednje, ali ne najmanje bitno, uvijek je dobra ideja napraviti sigurnosnu kopiju pri uređivanju datoteke sed . Da biste to učinili, samo pružite proširenje na opciju -i . Na primjer, za uređivanje file.txt i spremanje izvorne datoteke kao file.txt.bak upotrijebili biste:

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

ls

file.txt file.txt.bak

Rekurzivno pronađite i zamijenite

Ponekad želite rekurzivno pretraživati ​​imenike za datoteke koje sadrže niz i zamijenite niz u svim datotekama. To se može učiniti pomoću naredbi kao što su find ili grep za rekurzivno pronalaženje datoteka u direktoriju i cijeđenje imena datoteka u sed .

Sljedeća naredba rekurzivno će pretraživati ​​datoteke u trenutnoj radnoj mapi i proslijediti nazive datoteka sed .

find. -type f -exec sed -i 's/foo/bar/g' {} +

Da biste izbjegli probleme s datotekama koje sadrže naziv u njihovom imenu, upotrijebite opciju -print0 koja govori find za ispis imena datoteke, a zatim slijedi null znak i slanje izlaza na sed pomoću xargs -0 :

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

Da biste izuzeli direktorij, koristite opciju -not -path . Na primjer, ako zamjenjujete niz u vašem lokalnom git repo-u da biste isključili sve datoteke koje počinju s točkom ( . ), Upotrijebite:

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'

Druga je mogućnost upotreba naredbe grep za rekurzivno pronalaženje svih datoteka koje sadrže obrazac pretraživanja, a zatim slanje datoteka na sed :

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

Zaključak

Iako se može činiti kompliciranim i složenim, u početku je pretraživanje i zamjena teksta u datotekama sed vrlo jednostavan.

Da biste saznali više o naredbama, opcijama i zastavama, posjetite GNU sed priručnik i Grymoire sedni vodič. Ako imate bilo kakvih pitanja ili povratnih informacija, slobodno ostavite komentar.

sed terminal