Android

Slik bruker du sed til å finne og erstatte streng i filer

Den sanne historien om Paris Hilton | Dette er Paris Hilton Offisiell dokumentar

Den sanne historien om Paris Hilton | Dette er Paris Hilton Offisiell dokumentar

Innholdsfortegnelse:

Anonim

Ofte når du arbeider med tekstfiler må du finne og erstatte strengene med tekst i en eller flere filer.

sed er en tream ed itor. Den kan utføre grunnleggende tekstmanipulering på filer og inngangsstrømmer som rørledninger. Med sed kan du søke, finne og erstatte, sette inn og slette ord og linjer. Den støtter grunnleggende og utvidede vanlige uttrykk som lar deg matche komplekse mønstre.

, skal vi snakke om hvordan du finner og erstatter strenger med sed . Vi vil også vise deg hvordan du utfører et rekursivt søk og erstatter.

Finn og erstatt streng med sed

Det er flere versjoner av sed , med noen funksjonelle forskjeller mellom dem. macOS bruker BSD-versjonen og de fleste Linux-distribusjoner kommer med GNU sed forhåndsinstallert som standard. Vi bruker GNU-versjonen.

Den generelle formen for å søke og erstatte tekst ved å bruke sed har følgende form:

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

  • -i - Som standard skriver sed utdataene til standardutgangen. Dette alternativet ber sed å redigere filer på plass. Hvis det leveres en utvidelse (ex -i.bak), opprettes en sikkerhetskopi av den originale filen. s - Erstatningskommandoen, sannsynligvis den mest brukte kommandoen i sed. / / / - Avgrensende karakter. Det kan være et hvilket som helst tegn, men vanligvis brukes skråstrek ( / ) -tegnet. SEARCH_REGEX - Normal streng eller et vanlig uttrykk å søke etter. REPLACEMENT - Erstatningsstrengen. g - Globalt erstatningsflagg. Som standard leser sed filen linje for linje og endrer bare den første forekomsten av SEARCH_REGEX på en linje. Når erstatningsflagget leveres, vil alle forekomster erstattes. INPUTFILE - Navnet på filen du vil kjøre kommandoen på.

Det er en god praksis å sette sitater rundt argumentet slik at skallmetategnene ikke utvides.

La oss se eksempler på hvordan du bruker sed kommandoen til å søke og erstatte tekst i filer med noen av de mest brukte alternativene og flaggene.

For demonstrasjonsformål bruker vi følgende fil:

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

Med det globale erstatningsflagget erstatter sed alle forekomster av søkemønsteret:

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

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

Som du kanskje har lagt merke til, er også i forrige eksempel erstattet substring foo inni foobar strengen. Hvis dette ikke er ønsket oppførsel, kan du bruke ordgrenseuttrykket ( \b ) i begge ender av søkestrengen. Dette sikrer at delordene ikke samsvarer.

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

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

Bruk I flagget for å gjøre mønsteret samsvar med små bokstaver. I eksemplet nedenfor bruker vi både g og I flaggene:

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

Det enklere og mye mer leselige alternativet er å bruke et annet avgrensningskarakter. De fleste bruker den vertikale linjen ( | ) eller kolon (:), men du kan bruke et hvilket som helst annet tegn:

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

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

Du kan også bruke vanlige uttrykk. For eksempel for å søke i alle 3-sifrede numre og erstatte dem med strengenummeret du vil bruke:

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

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

En annen nyttig egenskap ved sed er at du kan bruke ampersand-tegnet & som tilsvarer det matchede mønsteret. Tegnet kan brukes flere ganger.

Hvis du for eksempel vil legge til krøllete seler {} rundt hvert tresifrede nummer, skriver du inn:

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

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

Sist, men ikke minst, er det alltid en god idé å ta en sikkerhetskopi når du redigerer en fil med sed . For å gjøre det bare gi en utvidelse til -i alternativet. For å redigere file.txt og lagre originalfilen som file.txt.bak , vil du for eksempel bruke:

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

ls

file.txt file.txt.bak

Rekursiv Finn og erstatt

Noen ganger vil du rekursivt søke i kataloger etter filer som inneholder en streng og erstatte strengen i alle filene. Dette kan gjøres ved å bruke kommandoer som find eller grep å rekursivt finne filer i katalogen og sende filnavnene til sed .

Følgende kommando vil rekursivt søke etter filer i den gjeldende arbeidskatalogen og overføre filnavnene til sed .

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

For å unngå problemer med filer som inneholder plass i navnene, bruk alternativet -print0 som forteller find å skrive ut filnavnet, etterfulgt av et xargs -0 og rør utdataene til sed ved å bruke xargs -0 :

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

For å ekskludere en katalog, bruk alternativet -not -path . Hvis du for eksempel bytter ut en streng i din lokale git repo for å ekskludere alle filer som begynner med prikk ( . ), Bruk:

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'

Et annet alternativ er å bruke grep kommandoen til å rekursivt finne alle filer som inneholder søksmønsteret, og deretter rør filnavnene til sed :

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

Konklusjon

Selv om det kan virke komplisert og sammensatt, er det i begynnelsen veldig enkelt å søke og erstatte tekst i filer med sed .

For å lære mer om sed kommandoer, alternativ og flagg, besøk GNU sed manual og Grymoire sed tutorial. Hvis du har spørsmål eller tilbakemeldinger, kan du gjerne legge igjen en kommentar.

sed terminal