Sed regex erstatter

Sed regex erstatter

I Unix/Linux er SED en dedikert kommando for redigering av strømmer. Det er her navnet på kommandoen kommer (Stream Editor). Det tar en strøm som input, filtrerer og forvandler innholdet og sender ut resultatet som instruert.

I denne guiden vil vi se på å bruke SED med de vanlige uttrykkene (Regex for kort) for å erstatte innholdet i en tekstfil. Denne guiden vil bruke GNU/Linux -versjonen av SED.

Ta tak i en eksempler på tekstfil

For demonstrasjonsformål lager vi en enkel tekstfil med litt tekst for å praktisere våre SED -kommandoer. Lag en tekstfil ved hjelp av Nano:

$ nano sed-practice.tekst

Inne i filen, skriv inn følgende tekst:

#!/bin/bash
Ekko "The Quick Brown Fox"
ekko "hopper over den late hunden"

Erstatte tekster ved hjelp av SED

Den primære kommandostrukturen til SED for å erstatte tekster er som følger:

$ sed -i 's /// g'

Her:

  • -I: Standard oppførsel av SED er å skrive utdataene til stdout (standardutgang). Imidlertid forteller dette flagget Sed å redigere filen (e) på plass i stedet. Hvis en forlengelse også er gitt (for eksempel -i.Bak), opprettes en sikkerhetskopi av den opprinnelige filen.
  • S: Instruerer SED om å utføre en erstatningsoperasjon på den gitte strømmen.
  • /: Avgrensningskarakteren.
  • : Et vanlig uttrykk for SED for å matche den gitte strømmen.
  • : Erstatningsstrengen.
  • G: Flagg instruere SED om å utføre en global erstatning. Som standard samsvarer SED bare og erstatter første forekomst.

La oss prøve det. I det følgende eksemplet erstatter vi de med DE i sed-praksis.tekst:

$ sed -i 's/the/the/g' sed -practice.tekst

Bekreft endringene.

$ CAT SED-PRACTICE.tekst

Som du kan se, endret vi innholdet i filen.

Arbeider med avgrensningskarakterer

Som beskrevet i forrige seksjon, kommer SED -instruksjoner med avgrensningskarakterer for å skille de forskjellige delene. Hvis vi ønsker å erstatte tekstene som inneholder avgrensningskarakteren, må vi bruke tilbakeslaget (\) for å unnslippe den.

La oss se på følgende eksempel:

$ sed -i 's/\/bin \/bash/\/usr \/bin \/zsh/g' sed -practice.tekst

Her erstatter vi/bin/bash med/usr/bin/zsh. Bekreft om forsøket er vellykket.

$ CAT SED-PRACTICE.tekst

Ved å bruke dette sikksakkmønsteret på frem og tilbakeslag, kan det lett bli ekstremt forvirrende. Derfor er det en vanlig praksis å bruke andre avgrensere som tykktarm (:) eller vertikal bar (|). La oss omskrive kommandoen ved hjelp av vertikal stang som avgrenser:

$ sed -i 's |/usr/bin/zsh |/bin/bash | g' sed -practice.tekst

Regex -karaktersett

Vi kan bruke karaktersettene til å beskrive et sett med tegn som skal erstatte i SED. Her er noen vanlige karaktersett du vil komme over:

  • [A-Z]: Alle små alfabeter.
  • [A-Z]: Alle de store alfabetene.
  • [0-9]: Alle sifrene.

I det følgende eksempel erstatter vi alle sifrene med alfabetet. Ta en titt på følgende eksempel:

$ ECHO 1001001 | sed -e 's | [0-9] | k | g'

Her erstatter SED alle sifrene (1 og 0, i dette tilfellet) det finner med bokstaven K.

Hva om vi vil erstatte 1 med A og 0 med B? Her er en måte å oppnå dette på:

$ ECHO 1001001 | sed -e 's | 1 | a | g' | sed -e 's | 0 | b | g'

Her erstatter den første SED -kommandoen 1 med en. Utgangen blir deretter avledes til en andre SED -kommando som erstatter 0 med B.

Konklusjon

I denne guiden demonstrerte vi kort de forskjellige måtene å bruke SED for å finne og erstatte tekstene. Ved hjelp av Regex kunne vi finjustere søket og erstatte det nøyaktige innholdet. Lær mer om Sed Regex.

Ved hjelp av noen ekstra verktøy som Find, kan vi bruke SED for å til og med rekursivt endre filene til en hel katalog.

Vi kan også implementere SED i bashskriptene for å utføre mer kompleks strømredigering. Lær mer om å starte reisen med bashskripting.