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 standardsedskriver sit output til standard output. Denne indstilling fortællersedfor 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æsersedfillinjen for linje og ændrer kun den første forekomst afSEARCH_REGEXpå 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