Når du arbeider med tekst-filer, vil du ofte trenger til søk og erstatt strenger med tekst i ett eller flere filer.
sed
er en stream editor. Det kan utføre grunnleggende tekst manipulasjon på filer og innspill bekker som rørledninger. Med sed
kan du søke etter, finne og erstatte, sette inn og slette ord og linjer. Den støtter grunnleggende og utvidede regulære uttrykk som tillater deg å matche komplekse mønstre.,
I denne artikkelen vil vi snakke om hvordan søk og erstatt strenger med sed
. Vi vil også vise deg hvordan du utfører en rekursiv søk og erstatt.
Finn og Erstatt Streng med sed – #
Det finnes flere versjoner av sed
, med noen funksjonelle forskjeller mellom dem. macOS bruker BSD-versjon, mens de fleste Linux-distribusjoner kommer med GNU sed
pre-installert som standard. Vi vil bruke GNU-versjon.,
Den generelle formen for å søke og erstatte tekst med sed
tar følgende form:
sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
-
-i
– standardsed
skriver resultatet til standard utdata. Dette alternativet angirsed
for å redigere filer i stedet. Hvis et adressetillegg er som følger (ex -jeg.bak), en sikkerhetskopi av den opprinnelige filen er opprettet. -
s
– skrivefeil, sannsynligvis den mest brukte kommandoen i sed. -
/ / /
– Skilletegn., Det kan være et hvilket som helst tegn, men vanligvis skråstrek (/
) tegn brukes. -
SEARCH_REGEX
– Normal streng eller et vanlig uttrykk å søke etter. -
REPLACEMENT
– Den nye strengen. -
g
– Global erstatning flagg. Som standardsed
leser filen linje for linje og endringer bare den første forekomsten avSEARCH_REGEX
på en linje. Når den nye flagg er gitt, alle hendelser er erstattet., -
INPUTFILE
– navnet på filen som du ønsker å kjøre kommandoen.
Det er en god praksis å sette anførselstegn rundt argumentet så skallet meta-tegn ikke vil utvide.
La oss se hvordan vi kan bruke sed
kommando for å søke etter og erstatte tekst i filer med noen av sine mest brukte alternativer og flagg.
som en demonstrasjon, vil vi bruke følgende fil:
123 Foo foo foo foo /bin/bash Ubuntu foobar 456
Hvis g
flagget er utelatt, vil bare den første forekomst av søkestrengen i hver linje er erstattet:
sed -i 's/foo/linux/' file.txt
123 Foo linux foo linux /bin/bash Ubuntu foobar 456
Med den globale erstatning flagg sed
erstatter alle forekomster av søk mønster:
sed -i 's/foo/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu linuxbar 456
Som du kanskje har lagt merke til, delstrengen foo
i foobar
string er også byttet ut i forrige eksempel., Hvis dette ikke er ønsket atferd, bruk word-grensen uttrykk (\b
) i begge ender av søkestrengen. Dette sikrer delvis ord er ikke matchet.
sed -i 's/\bfoo\b/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu foobar 456
for Å lage mønsteret match mellom store og små bokstaver, kan du bruke I
flagg., I eksemplet nedenfor har vi bruker både g
og I
flagg:
sed -i 's/foo/linux/gI' file.txt
123 linux linux linux linux /bin/bash Ubuntu linuxbar 456
Hvis du ønsker å finne og erstatte en streng som inneholder skilletegn (/
) du trenger for å bruke en omvendt skråstrek (\
) for å unnslippe skråstrek. For eksempel å erstatte /bin/bash
med /usr/bin/zsh
du kan bruke
sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt
Det enklere og mye mer lesbar alternativet er å bruke et annet skilletegn., De fleste bruker en vertikal strek (|
) eller kolon (:
), men du kan bruke hvilken som helst annen karakter:
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 regulære uttrykk. For eksempel, for å søke etter alle 3-sifret tall og erstatte dem med streng number
du kan bruke:
sed -i 's/\b\{3\}\b/number/g' file.txt
number Foo foo foo foo /bin/bash demo foobar number
en Annen nyttig funksjon av sed er at du kan bruke tegn-tegnet &
som tilsvarer matchet mønster., Tegnet kan brukes flere ganger.
For eksempel, hvis du ønsker å legge krøllparentes {}
rundt hver 3-sifret nummer, skriv:
sed -i 's/\b\{3\}\b/{&}/g' file.txt
{123} Foo foo foo foo /bin/bash demo foobar {456}
Sist, men ikke minst, det er alltid en god idé å lage en backup når du redigerer en fil med sed
. For å gjøre det, bare gi en utvidelse for backup fil til -i
alternativ., For eksempel, hvis du vil redigere file.txt
og lagre den originale filen som file.txt.bak
du kan bruke:
sed -i.bak 's/foo/linux/g' file.txt
for Å sikre at backup er opprettet, er en liste over filene med ls
kommando:
ls
file.txt file.txt.bak
Rekursiv søk og Erstatt #
noen Ganger ønsker du kanskje å undermapper søk kataloger for filer som inneholder en streng og erstatte strengen i alle filer., Dette kan gjøres ved hjelp av kommandoer som for eksempel find
eller grep
for å undermapper finne filene i katalogen og rør fil-navn sed
.
følgende kommando vil undermapper du vil søke etter filer i gjeldende arbeidsmappe og passere fil navn til sed
.,
find . -type f -exec sed -i 's/foo/bar/g' {} +
for Å unngå problemer med filer som inneholder mellomrom i navnene deres, kan du bruke -print0
alternativ, som forteller find
for å skrive ut filen navn, etterfulgt av et null-karakter og rør det utgang til sed
med xargs -0
:
find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'
Hvis du vil utelate en katalog, bruk -not -path
alternativ.,arting med dot (.
), bruker du:
find . -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'
Hvis du vil søke etter og erstatte tekst i filer med en bestemt filtype, vil du bruke:
find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'
et Annet alternativ er å bruke grep
kommando for å undermapper finne alle filer som inneholder den søke mønster og deretter røret filnavn til sed
:
grep -rlZ 'foo' . | xargs -0 sed -i.bak 's/foo/bar/g'
Konklusjon #
Selv om det kan virke kompliserte og sammensatte, på første, søke og erstatte tekst i filer med sed
er veldig enkelt.,
for Å lære mer om sed
kommandoer, valg, og flagg, besøk GNU sed manuell og Grymoire sed opplæringen .
Leave a Reply