tekstitiedostojen kanssa työskennellessä, sinun on usein löydettävä ja korvattava merkkijonot yhdessä tai useammassa tiedostossa.
sed on stream editor. Se voi suorittaa perus-tekstin manipulointi tiedostoja ja syöttövirrat, kuten putkistot. sed voit etsiä, etsiä ja korvata, lisätä ja poistaa sanoja ja rivejä. Se tukee perus-ja laajennettu säännöllisiä lausekkeita, joiden avulla voit sovittaa monimutkaisia kuvioita.,
tässä artikkelissa puhutaan siitä, miten merkkijonot löytää ja korvata sed. Näytämme myös, miten tehdä rekursiivinen haku ja korvata.
Etsi ja Korvaa Merkkijonon kanssa sed #
On olemassa useita versioita sed joitakin toiminnallisia eroja niiden välillä. macOS käyttää BSD-versiota, kun taas useimmissa Linux-jakeluissa on mukana GNU sed esiasennettuna oletuksena. Käytämme GNU-versiota.,
yleinen muoto etsii ja korvaa tekstiä sed ottaa seuraava muoto:
sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
-
-i– oletuksenasedkirjoittaa sen tuloste vakiotulosteeseen. Tämä vaihtoehto kertoosedmuokata tiedostoja paikallaan. Jos laajennus toimitetaan (ex-i. bak), luodaan varmuuskopio alkuperäisestä tiedostosta. -
s– korvaava komento, luultavasti sed: n käytetyin komento. -
/ / /– erotinmerkki., Se voi olla mikä tahansa merkki, mutta yleensä käytetään slash-merkkiä (/). -
SEARCH_REGEX– Normaali merkkijono tai säännöllinen lauseke etsi. -
REPLACEMENT– korvaava merkkijono. -
g– Global replacement flag. Oletuksenasedlukee tiedoston rivi kerrallaan ja muutoksia vain ensimmäinen esiintyminenSEARCH_REGEXlinja. Kun korvaava lippu toimitetaan, kaikki poikkeamat korvataan., -
INPUTFILE– tiedoston nimi, jolla haluat suorittaa komennon.
on hyvä käytäntö laittaa lainausmerkkejä argumentin ympärille, jotta Shellin metamerkit eivät laajene.
katsotaanpa, miten voimme käyttää sed komento etsi ja korvaa tekstiä tiedostoista joitakin sen kaikkein yleisesti käytetty vaihtoehtoja ja liput.
demonstrointitarkoituksessa käytämme seuraavaa tiedostoa:
123 Foo foo foo foo /bin/bash Ubuntu foobar 456
– Jos g lippu on jätetty pois, vain ensimmäinen esiintymä haku merkkijono jokainen rivi on vaihdettu:
sed -i 's/foo/linux/' file.txt
123 Foo linux foo linux /bin/bash Ubuntu foobar 456
global korvaavan lippu sed korvaa kaikki esiintymät hakulauseke:
sed -i 's/foo/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu linuxbar 456
Kuten olet ehkä huomannut, osamerkkijono foo sisälle foobar string on korvattu myös edellisessä esimerkissä., Jos tämä ei ole haluttua käytöstä, käytä hakusanan molemmissa päissä sanarajaa (\b). Näin varmistetaan, että osasanat eivät täsmää.
sed -i 's/\bfoo\b/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu foobar 456
Jotta kuvio ottelu kirjainkoko, käytä I lippu., Alla olevassa esimerkissä käytämme molemmat g ja I liput:
sed -i 's/foo/linux/gI' file.txt
123 linux linux linux linux /bin/bash Ubuntu linuxbar 456
Jos haluat etsiä ja korvata merkkijonon, joka sisältää erotin-merkki (/) sinun täytyy käyttää kenoviivaa (\) paeta slash. Esimerkiksi korvata /bin/bash /usr/bin/zsh voit käyttää
sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt
helpompaa ja paljon luettavampi vaihtoehto on käyttää toisen erotin merkki., Useimmat ihmiset käyttävät pystypalkki (|) tai paksusuolen (:), mutta voit käyttää mitä tahansa muun merkin:
sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt
123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456
Voit käyttää myös säännöllisiä lausekkeita. Jos esimerkiksi haluat etsiä kaikki 3-numeroinen numerot ja korvata ne merkkijono number voit käyttää:
sed -i 's/\b\{3\}\b/number/g' file.txt
number Foo foo foo foo /bin/bash demo foobar number
Toinen hyödyllinen ominaisuus sed on, että voit käyttää et-merkki et-merkki & joka vastaa hyväksytty malli., Hahmoa voidaan käyttää useita kertoja.
esimerkiksi, jos haluat lisätä kihara henkselit {} noin jokainen 3-numeroinen numero, tyyppi:
sed -i 's/\b\{3\}\b/{&}/g' file.txt
{123} Foo foo foo foo /bin/bash demo foobar {456}
Viimeisenä mutta ei vähäisimpänä, se on aina hyvä idea tehdä varmuuskopio, kun muokkaat tiedostoa, jossa sed. Voit tehdä, että, vain antaa laajennus varmuuskopio -i vaihtoehto., Esimerkiksi, jos haluat muokata file.txt ja tallenna alkuperäisen tiedoston file.txt.bak voit käyttää:
sed -i.bak 's/foo/linux/g' file.txt
varmista, että varmuuskopio on luotu, luettelo tiedostot ls komento:
ls
file.txt file.txt.bak
Rekursiivinen Etsi ja Korvaa #
Joskus saatat haluta rekursiivisesti etsiä hakemistoista tiedostot, jotka sisältävät merkkijonon ja korvaa merkkijonon kaikki tiedostot., Tämä voidaan tehdä käyttämällä komentoja kuten find tai grep rekursiivisesti etsiä tiedostoja hakemistoon ja putkisto tiedoston nimet sed.
seuraava komento rekursiivisesti etsiä tiedostoja nykyinen työhakemisto, ja siirtää tiedoston nimet sed.,
find . -type f -exec sed -i 's/foo/bar/g' {} +
Jotta vältettäisiin ongelmia tiedostoja, jotka sisältävät tilaa niiden nimet, käytä -print0 vaihtoehto, joka kertoo find tulostaa tiedoston nimi, seuraa null-merkki ja putken lähtö sed käyttäen xargs -0 :
find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'
sulje pois hakemistoon, käytä -not -path vaihtoehto.,arting piste (.), käytä:
find . -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'
Jos haluat etsiä ja korvata tekstiä vain tiedostoja, joilla on erityinen laajennus, sinun tulee käyttää:
find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'
Toinen vaihtoehto on käyttää grep komento rekursiivisesti löytää kaikki tiedostot, joissa hakulauseke ja sitten putki tiedostonimissä sed:
grep -rlZ 'foo' . | xargs -0 sed -i.bak 's/foo/bar/g'
Johtopäätös #
Vaikka se voi tuntua monimutkainen ja monimutkainen aluksi, etsiminen ja korvaaminen tekstiä tiedostoista, jossa sed on hyvin yksinkertainen.,
lisätietoja sed komennot, asetukset ja liput, käy GNU sed manuaalinen ja Grymoire sed opetusohjelma .
Leave a Reply