Når du arbejder med tekstfiler, skal du ofte finde og erstatte tekststrenge i en eller flere filer.
sed
er en stream editor. Det kan udføre grundlæggende tekst manipulation på Filer og input streams såsom rørledninger. Med sed
kan du søge, finde og erstatte, indsætte og slette ord og linjer. Det understøtter grundlæggende og udvidede regulære udtryk, der giver dig mulighed for at matche komplekse mønstre.,
i denne artikel vil vi tale om, hvordan du finder og erstatter strenge med sed
. Vi viser dig også, hvordan du udfører en rekursiv søgning og erstatter.
Find og Erstat-String med sed #
Der er flere versioner af sed
, med nogle funktionelle forskelle mellem dem. macOS bruger BSD-versionen, mens de fleste Linu.-distributioner leveres med GNU sed
forudinstalleret som standard. Vi bruger GNU-versionen.,
Den generelle form af at søge og erstatte tekst ved hjælp af sed
tager følgende form:
sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
-
-i
– Som standardsed
skriver sit output til standard output. Denne indstilling fortællersed
for at redigere filer på plads. Hvis der leveres en udvidelse (e.- i.bak), oprettes en sikkerhedskopi af den originale fil. -
s
– erstatningskommandoen, sandsynligvis den mest anvendte kommando i sed. -
/ / /
– Delimiter karakter., Det kan være et hvilket som helst tegn, men normalt bruges skråstregen (/
). -
SEARCH_REGEX
– Normal streng eller et regulært udtryk at søge efter. -
REPLACEMENT
– erstatningsstrengen. -
g
– globalt udskiftningsflag. Som standard læsersed
fillinjen for linje og ændrer kun den første forekomst afSEARCH_REGEX
på en linje. Når udskiftningsflagget er angivet, udskiftes alle forekomster., -
INPUTFILE
– navnet på den fil, som du vil køre kommandoen på.
det er en god praksis at sætte citater omkring argumentet, så skalmeta-tegnene ikke udvides.
lad os se, hvordan vi kan bruge kommandoen sed
til at søge og erstatte tekst i filer med nogle af dens mest anvendte indstillinger og flag.
til demonstrationsformål bruger vi følgende fil:
123 Foo foo foo foo /bin/bash Ubuntu foobar 456
Hvis g
flag er udeladt, er det kun den første forekomst af søgestrengen i hver linje er udskiftet:
sed -i 's/foo/linux/' file.txt
123 Foo linux foo linux /bin/bash Ubuntu foobar 456
Med den globale udskiftning flag sed
erstatter alle forekomster af søgningen mønster:
sed -i 's/foo/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu linuxbar 456
Som du måske har bemærket, substring foo
i foobar
string er også erstattet i det foregående eksempel., Hvis dette ikke er den ønskede opførsel, skal du bruge ordgrænseudtrykket (\b
) i begge ender af søgestrengen. Dette sikrer, at de delvise ord ikke matches.
sed -i 's/\bfoo\b/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu foobar 456
for at gøre mønstret match tilfælde ufølsom, brug I
flag., I eksemplet nedenfor bruger vi både g
og I
flag:
sed -i 's/foo/linux/gI' file.txt
123 linux linux linux linux /bin/bash Ubuntu linuxbar 456
Hvis du vil søge efter og erstat en streng, der indeholder den separator-tegn (/
) du bliver nødt til at bruge den omvendte skråstreg (\
) til at flygte skråstreg. For eksempel at erstatte /bin/bash
med /usr/bin/zsh
du vil bruge
sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt
Det nemmere og meget mere læsbar mulighed er at benytte et andet skilletegn karakter., De fleste mennesker bruger den lodrette bjælke (|
) eller kolon (:
), men du kan bruge enhver anden 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å bruge regulære udtryk. For eksempel, for at søge efter alle 3-cifret tal, og erstatte dem med strengen number
ville du bruge:
sed -i 's/\b\{3\}\b/number/g' file.txt
number Foo foo foo foo /bin/bash demo foobar number
en Anden nyttig funktion i sed er, at du kan bruge ampersand-tegnet &
, der svarer til den matchende mønster., Tegnet kan bruges flere gange.
For eksempel, hvis du ønsker at tilføje krøllede parenteser {}
rundt om hver 3-cifret nummer, skriv:
sed -i 's/\b\{3\}\b/{&}/g' file.txt
{123} Foo foo foo foo /bin/bash demo foobar {456}
Sidst, men ikke mindst, det er altid en god idé at lave en backup, når du redigerer en fil med sed
. For at gøre det skal du bare give en udvidelse til sikkerhedskopifilen til -i
., For eksempel, for at redigere file.txt
og gemme den originale fil som file.txt.bak
ville du bruge:
sed -i.bak 's/foo/linux/g' file.txt
for At sikre, at backup er skabt, en liste over de filer med ls
kommando:
ls
file.txt file.txt.bak
Rekursiv Find og Erstat #
nogle gange ønsker du måske at rekursivt søg mapper, filer, der indeholder en streng og erstatte strengen i alle filer., Dette kan gøres ved hjælp af kommandoer, som f.eks. find
eller grep
rekursivt at finde filer i den mappe, og rør den fil navne sed
.
følgende kommando vil rekursivt søge efter filer i den aktuelle arbejdsmappe og videregive filnavnene til sed
.,
find . -type f -exec sed -i 's/foo/bar/g' {} +
for At undgå problemer med filer, der indeholder plads i deres navne, skal du bruge -print0
indstilling, der fortæller find
, for at udskrive filen navn, efterfulgt af en null-tegn og pipe output til sed
hjælp xargs -0
:
find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'
hvis du vil udelade en mappe, skal du bruge -not -path
option.,arting med dot (‘.
), skal du bruge:
find . -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'
Hvis du ønsker at søge efter og erstatte tekst kun på filer med et bestemt filtypenavn, du vil bruge:
find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'
en Anden mulighed er at bruge grep
kommando til rekursivt at finde alle filer, som indeholder søgemønsteret, og rør derefter de filnavne, at sed
:
grep -rlZ 'foo' . | xargs -0 sed -i.bak 's/foo/bar/g'
Konklusion #
Selv om det kan virke kompliceret og komplekst, ved først at søge og erstatte tekst i filer med sed
det er meget simpelt.,
Hvis du vil vide mere om sed
kommandoer, indstillinger og flag, skal du besøge GNU sed manual og Grymoire sed tutorial .
Leave a Reply