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
– oletuksenased
kirjoittaa sen tuloste vakiotulosteeseen. Tämä vaihtoehto kertoosed
muokata 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. Oletuksenased
lukee tiedoston rivi kerrallaan ja muutoksia vain ensimmäinen esiintyminenSEARCH_REGEX
linja. 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