Android

Sådan bruges sed til at finde og udskifte streng i filer

Tek kristalli çift küp örgü (Single crystal double Cubic Raw)

Tek kristalli çift küp örgü (Single crystal double Cubic Raw)

Indholdsfortegnelse:

Anonim

Når du arbejder med tekstfiler, bliver du ofte nødt til at finde og udskifte strenge med tekst i en eller flere filer.

sed er en tream ed itor. Det kan udføre grundlæggende tekstmanipulation på filer og inputstrømme 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 regelmæssige udtryk, der giver dig mulighed for at matche komplekse mønstre.

, vil vi tale om, hvordan man finder og udskifter strenge med sed . Vi viser dig også, hvordan du udfører en rekursiv søgning og udskifter.

Find og udskift streng med sed

Der er flere versioner af sed , med nogle funktionelle forskelle mellem dem. macOS bruger BSD-versionen, og de fleste Linux-distributioner leveres med GNU sed forudinstalleret som standard. Vi bruger GNU-versionen.

Den generelle form for søgning og udskiftning af tekst ved hjælp af sed har følgende form:

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

  • -i - Som standard skriver sed dens output til standardoutputet. Denne mulighed fortæller sed at redigere filer på plads. Hvis der leveres en udvidelse (ex -i.bak), oprettes en sikkerhedskopi af den originale fil. s - Erstatningskommandoen, sandsynligvis den mest anvendte kommando i sed. / / / - Afgrænsningstegn. Det kan være et hvilket som helst tegn, men normalt bruges skråstreg ( / ) -tegnet. SEARCH_REGEX - Normal streng eller et almindeligt udtryk at søge efter. REPLACEMENT - Erstatningsstrengen. g - Globalt erstatningsflag. Som standard læser sed filen linje for linje og ændrer kun den første forekomst af SEARCH_REGEX på en linje. Når der er udskiftet flag, udskiftes alle forekomster. INPUTFILE - Navnet på den fil, du vil køre kommandoen på.

Det er en god praksis at placere citater omkring argumentet, så shell-metategnene ikke udvides.

Lad os se eksempler på, hvordan du bruger sed kommandoen til at søge og udskifte tekst i filer med nogle af dens mest almindeligt anvendte indstillinger og flag.

Til demonstrationsformål bruger 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 erstatningsflag erstatter sed alle forekomster af søgemønsteret:

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

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

Som du måske har bemærket, udskiftes i det forrige eksempel også substring foo inde i foobar strengen. Hvis dette ikke er den ønskede opførsel, skal du bruge ordbegrænsningsudtrykket ( \b ) i begge ender af søgestrengen. Dette sikrer, at de delvise ord ikke stemmer overens.

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

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

Brug I flag for at gøre mønsteret match mellem store og små bogstaver. I eksemplet nedenfor bruger vi både g og I flagene:

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

Den lettere og meget mere læsbare mulighed er at bruge en anden afgrænsningskarakter. De fleste mennesker bruger den lodrette bjælke ( | ) eller kolon (:), men du kan bruge ethvert andet 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å bruge regelmæssige udtryk. For eksempel at søge i alle 3-cifrede numre og erstatte dem med det strengenummer, du vil bruge:

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

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

Et andet nyttigt træk ved sed er, at du kan bruge ampersand-tegnet & som svarer til det matchede mønster. Tegnet kan bruges flere gange.

Hvis du f.eks. Vil tilføje krøllede seler {} omkring hvert 3-cifrede nummer, skal du skrive:

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

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

Sidst men ikke mindst er det altid en god ide at lave en sikkerhedskopi, når du redigerer en fil med sed . For at gøre det skal du bare give en udvidelse til -i indstillingen. For eksempel 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

ls

file.txt file.txt.bak

Rekursiv Find og udskift

Undertiden vil du rekursivt søge i mapper efter filer, der indeholder en streng, og erstatte strengen i alle filer. Dette kan gøres ved at bruge kommandoer som find eller grep til rekursivt at finde filer i biblioteket og rør filnavne til sed .

Den følgende kommando søger rekursivt efter filer i det aktuelle arbejdsmappe og videresender filnavne 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 indstillingen -print0 , der fortæller find til at udskrive filnavnet, efterfulgt af et nulltegn og rør output til sed ved hjælp af xargs -0 :

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

For at ekskludere et bibliotek skal du bruge indstillingen- -not -path . Hvis du f.eks. Udskifter en streng i din lokale git-repo for at ekskludere alle filer, der starter med prik ( . ), Skal du bruge:

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'

En anden mulighed er at bruge grep kommandoen til rekursivt at finde alle filer, der indeholder søgemønsteret, og derefter rør filnavne til sed :

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

Konklusion

Selvom det kan virke kompliceret og kompliceret, er det i starten meget let at søge og udskifte tekst i filer med sed .

For at lære mere om sed kommandoer, option og flag kan du besøge GNU sed-manualen og Grymoire sed-tutorial. Hvis du har spørgsmål eller feedback, er du velkommen til at give en kommentar.

sed terminal