Android

Kuinka käyttää sed-tiedostoa merkkijonojen löytämiseen ja korvaamiseen tiedostoissa

Android 101 by Fred Widjaja

Android 101 by Fred Widjaja

Sisällysluettelo:

Anonim

Melko usein tekstitiedostojen kanssa työskennellessäsi on löydettävä ja korvattava yhden tai useamman tiedoston tekstijonot.

sed on tream ed itor. Se voi suorittaa tekstin perustoiminnot tiedostoilla ja syöttövirroilla, kuten putkilinjoilla. sed voit etsiä, löytää ja korvata, lisätä ja poistaa sanoja ja rivejä. Se tukee perus- ja laajennettuja säännöllisiä lausekkeita, joiden avulla voit sovittaa monimutkaiset kuviot.

, puhumme siitä kuinka löytää ja korvata merkkijonot sed . Osoitamme sinulle myös, kuinka suorittaa rekursiivinen haku ja korvaaminen.

Etsi ja korvaa merkkijono sed

Sedistä on useita versioita, joiden välillä on joitain toiminnallisia eroja. macOS käyttää BSD-versiota ja useimmissa Linux-jakeluissa on oletuksena esiasennettu GNU sed . Käytämme GNU-versiota.

Tekstin etsimisen ja korvaamisen yleinen muoto sed on seuraava:

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

  • -i - Oletuksena sed kirjoittaa ulostulon sed . Tämä vaihtoehto käskee sed : n muokata tiedostoja paikallaan. Jos mukana toimitetaan laajennus (ex -i.bak), alkuperäisestä tiedostosta luodaan varmuuskopio. s - Korvaava komento, luultavasti eniten käytetty komento sedissä. / / / - Erotinmerkki. Se voi olla mikä tahansa merkki, mutta yleensä käytetään kaltevuusviivaa ( / ). SEARCH_REGEX - Normaali merkkijono tai säännöllinen lauseke, jota etsit. REPLACEMENT - Korvaava merkkijono. g - Globaali korvaava lippu. Oletuksena sed lukee tiedosto riviltä riviltä ja muuttaa vain ensimmäisen rivin SEARCH_REGEX esiintymisen. Kun korvaava lippu toimitetaan, kaikki esiintymät korvataan. INPUTFILE - sen tiedoston nimi, johon haluat suorittaa komennon.

On hyvä käytäntö laittaa lainauksia argumentin ympärille, jotta kuoren metamerkit eivät laajene.

Katsotaan esimerkkejä siitä, kuinka sed komennolla voidaan etsiä ja korvata tiedostojen tekstiä joillakin sen yleisimmin käytetyistä vaihtoehdoista ja lipuista.

Esittelyssä käytämme seuraavaa tiedostoa:

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

Globaalilla korvauslipulla sed korvaa kaikki sed esiintymät:

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

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

Kuten olet voinut huomata, edellisessä esimerkissä korvataan myös foobar foo foobar merkkijonon sisällä. Jos tämä ei ole haluttu käyttäytyminen, käytä sanarajaista lauseketta ( \b ) hakujonon molemmissa päissä. Tämä varmistaa, että osittaisia ​​sanoja ei ole sovittu yhteen.

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

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

Jotta kuviotulos kirjaimet eivät ole herkkiä, käytä I merkintää. Alla olevassa esimerkissä käytämme sekä l- että g lippuja:

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

Helpoin ja paljon luettavampi vaihtoehto on käyttää toista rajaavaa merkkiä. Useimmat ihmiset käyttävät pystypalkkia ( | ) tai kaksoispistettä (:), mutta voit käyttää mitä tahansa muuta merkkiä:

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. Esimerkiksi etsiäksesi kaikki 3-numeroiset numerot ja korvata ne käyttämälläsi merkkijonolla:

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

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

Toinen hyödyllinen sed-ominaisuus on, että voit käyttää ampersand-merkkiä & joka vastaa sovitettua mallia. Merkkiä voidaan käyttää useita kertoja.

Jos esimerkiksi haluat lisätä kihara-aukkoja {} jokaisen 3-numeroisen numeron ympärille, kirjoita:

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ä, on aina hyvä idea tehdä varmuuskopio muokattaessa tiedostoa sed . Tarjoa vain laajennus -i vaihtoehtoon. Voit esimerkiksi muokata file.txt ja tallentaa alkuperäisen tiedoston nimellä file.txt.bak jota käyttäisit:

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

ls

file.txt file.txt.bak

Rekursiivinen haku ja korvaa

Joskus haluat hakea rekursiivisesti hakemistoja tiedostoista, jotka sisältävät merkkijonon, ja korvata merkkijono kaikista tiedostoista. Tämä voidaan tehdä käyttämällä komentoja, kuten find tai grep , hakemaan tiedostoja rekursiivisesti hakemistosta ja viemällä grep tiedostonimet.

Seuraava komento etsii rekursiivisesti nykyisen työhakemiston tiedostoja ja välittää tiedostonimet sed tiedostoon.

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

Välttääksesi ongelmat tiedostoissa, joissa nimissä on tilaa, käytä -print0 vaihtoehtoa, joka käskee find tulostamaan tiedostonimen, jota seuraa nolla merkki ja -print0 xargs -0 : n avulla:

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

Jos haluat jättää hakemiston pois, käytä -not -path vaihtoehtoa. Jos esimerkiksi korvaat merkkijonon paikallisessa git-repo-ohjelmassa poistaaksesi kaikki tiedostot, jotka alkavat pisteellä ( . ), Käytä:

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'

Toinen vaihtoehto on käyttää grep komentoa löytääksesi rekursiivisesti kaikki tiedostot, jotka sisältävät hakumallin, ja sed sitten tiedostonimet sed :

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

johtopäätös

Vaikka se voi vaikuttaa monimutkaiselta ja monimutkaiselta, tiedostojen tekstin etsiminen ja korvaaminen sed on aluksi hyvin yksinkertaista.

Lisätietoja sed komennoista, lisävarusteista ja lipuista on GNU sed -käsikirjassa ja Grymoire sed -oppaassa. Jos sinulla on kysyttävää tai palautetta, jätä kommentti.

sed-pääte