Welcome to Our Website

Grunnleggende Bruk av Sed-Stream Editor for å Manipulere Tekst i Linux

Innledning

sed – kommandoen, kort for stream editor, utfører redigering operasjoner på tekst som kommer fra standard input eller en fil. sed redigeringer linje-for-linje og i en ikke-interaktiv måte.

Dette betyr at du gjør alle de redigering beslutninger som du kaller det-kommandoen, og sed utfører retningene automatisk., Dette kan virke forvirrende eller unintuitive, men det er en veldig kraftig og rask måte å forvandle tekst, spesielt som en del av et skript eller en automatisert arbeidsflyt.

Denne opplæringen vil dekke noen grunnleggende operasjoner og introdusere deg til syntaksen som kreves for å drive denne editoren. Du vil nesten helt sikkert aldri erstatte en vanlig tekst-editor med sed, men det vil trolig bli en velkommen tillegg til dine tekstredigering verktøykassa.

Merk: Denne veiledningen bruker GNU versjon av sed funnet på Ubuntu og andre Linux-operativsystemer., Hvis du bruker mac os, vil du ha BSD-versjon som har ulike alternativer og argumenter. Du kan installere GNU versjon av sed med Homebrew ved hjelp av brew install gnu-sed.

Lansere en Interaktiv Terminal!

Grunnleggende Bruk

sed opererer på en strøm av teksten at det står enten fra en tekstfil eller fra standard input (STDIN). Dette betyr at du kan sende utdata til en annen kommando direkte inn sed for redigering, eller du kan arbeide med en fil som du allerede har opprettet.,

Du bør også være klar over at sed utganger alt til standard ut (STDOUT) som standard. Det betyr at med mindre omdirigert, sed vil skrive ut resultatet til skjermen i stedet for å lagre det i en fil.

De grunnleggende bruk er:

  • sed commands

I denne opplæringen, vil du bruke en kopi av BSD-Lisensen til å eksperimentere med sed., På Ubuntu, kjør følgende kommandoer for å kopiere BSD-lisensen filen til ditt hjemmeområde, slik at du kan arbeide med det:

  • cd
  • cp /usr/share/common-licenses/BSD .

Hvis du ikke har en lokal kopi av BSD-lisensen, lage en selv med denne kommandoen:

  • cat << 'EOF' > BSD
  • Copyright (c) The Regents of the University of California.
  • All rights reserved.
  • Redistribution and use in source and binary forms, with or without
  • modification, are permitted provided that the following conditions
  • are met:
  • 1. Redistributions of source code must retain the above copyright
  • notice, this list of conditions and the following disclaimer.
  • 2. Redistributions in binary form must reproduce the above copyright
  • notice, this list of conditions and the following disclaimer in the
  • documentation and/or other materials provided with the distribution.
  • 3. Neither the name of the University nor the names of its contributors
  • may be used to endorse or promote products derived from this software
  • without specific prior written permission.
  • THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  • ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  • IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  • ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  • FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  • DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  • OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  • HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  • LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  • OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  • SUCH DAMAGE.
  • EOF

La oss bruke sed for å vise innholdet av BSD-lisensen fil. sed sender resultatene til skjermen som standard, noe som betyr at du kan bruke den som en fil reader ved å føre det ingen redigering av kommandoer., Prøv å utføre følgende kommando:

  • sed '' BSD

vil Du se BSD-lisensen vises på skjermen:

Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.......

Den enkle anførselstegn inneholder redigering av kommandoer du går til sed. I dette tilfellet, har du passert det ingenting, så sed skrives ut hver linje fikk det til standard output.

sed kan bruke standard input snarere enn en fil., Rør utdataene fra cat – kommandoen til sed for å produsere samme resultat:

  • cat BSD | sed ''

Du vil se resultatet av filen:

Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.. . .. . .

Som du kan se, kan du drive på filer eller strømmer av tekst som de produseres når rørene utgang med pipe (|) karakter, like enkelt.

Utskrift Linjer

I forrige eksempel, du så at skriving gått inn sed uten noen operasjoner ville skrive ut resultatene direkte til standard output.,

La oss utforske sed‘s eksplisitt print – kommandoen, som du angir ved hjelp av p karakter i enkle anførselstegn.

– Utfør følgende kommando:

  • sed 'p' BSD

Du vil se hver linje av BSD filen skrevet ut to ganger:

Output
Copyright (c) The Regents of the University of California.Copyright (c) The Regents of the University of California.All rights reserved.All rights reserved.Redistribution and use in source and binary forms, with or withoutRedistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsmodification, are permitted provided that the following conditionsare met:are met:. . .. . .

sed automatisk skriver ut hver linje som standard, og så har du fortalt det til å skrive ut linjer eksplisitt med «p» – kommandoen, så får du hver linje skrives to ganger.,

Hvis du undersøker utgang nøye, vil du se at den har den første linjen to ganger, etterfulgt av den andre linjen to ganger, etc, som forteller deg at sed opererer på data linje for linje. Den leser en linje, som opererer på det, og sender den resulterende teksten før du gjenta prosessen på neste linje.

Du kan rydde opp resultatene ved å sende -n alternativ til sed, som undertrykker automatisk utskrift:

  • sed -n 'p' BSD
Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.. . .. . .

Vi nå er tilbake til å skrive ut hver linje en gang.,

eksemplene så langt kan neppe anses å redigere (med mindre du ønsket å skrive ut hver linje to ganger…). Neste du vil utforske hvordan sed kan endre utgang ved å målrette mot bestemte deler av teksten data.

ved Hjelp av Address Varierer

Adresser la du målrette mot bestemte deler av en tekst strømmen. Du kan angi en bestemt linje, eller til og med en rekke linjer.

La oss ha det sed skriv ut den første linjen i filen., Utfør følgende kommando:

  • sed -n '1p' BSD

Den første linjen skrives ut til skjermen:

Output
Copyright (c) The Regents of the University of California.

Ved å plassere antall 1 før du skriv ut-kommandoen, kan du fortalte sed linjenummeret til å operere på. Du kan like enkelt ut fem linjer (ikke glem «-n»):

  • sed -n '1,5p' BSD

vil Du se dette utgang:

Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditions

Du har nettopp gitt et adresseområde til sed., Hvis du gir sed en adresse, det vil bare utføre kommandoer som følger på disse linjene. I dette eksempel, du har fortalt sed å skrive ut linje 1 og linje 5. Du kunne ha spesifisert dette på en annen måte ved å gi den første adressen, og deretter bruke en forskyvning å fortelle sed hvor mange flere linjer til å reise slik som dette:

  • sed -n '1,+4p' BSD

Dette vil resultere i samme effekt, fordi du fortalte sed for å starte på linje 1, og deretter operere på de neste 4 linjer.,

Hvis du ønsker å skrive ut annenhver linje, angi intervallet etter ~ karakter. Den følgende kommandoen skriver ut annenhver linje i BSD – filen, starter med linje 1:

  • sed -n '1~2p' BSD

Her er det utgang vil du se følgende:

Output
Copyright (c) The Regents of the University of California.modification, are permitted provided that the following conditions1. Redistributions of source code must retain the above copyright2. Redistributions in binary form must reproduce the above copyright documentation and/or other materials provided with the distribution. may be used to endorse or promote products derived from this software. . .. . .

Du kan bruke sed for å slette tekst fra utgang i tillegg.,

Slette Tekst

Du kan utføre tekst sletting hvor du tidligere var angi tekst utskrift ved å endre p kommandoen d – kommandoen.

I dette tilfellet, du trenger ikke lenger -n kommando fordi sed vil skrive ut alt som ikke er slettet. Dette vil hjelpe deg å se hva som skjer.,

Endre den siste kommandoen fra forrige avsnitt til å gjøre det
slett alle andre linjen som starter med det første:

  • sed '1~2d' BSD

resultatet er at du ser hver linje du ikke ble gitt siste gang:

Output
All rights reserved.Redistribution and use in source and binary forms, with or withoutare met: notice, this list of conditions and the following disclaimer. notice, this list of conditions and the following disclaimer in the3. Neither the name of the University nor the names of its contributors without specific prior written permission.. . .. . .

Det er viktig å merke seg her at vår kilde filen ikke blir berørt. Det er fortsatt intakt. Endringene er utdata til skjermen vår.,

Hvis vi ønsker å spare våre redigeringer, vi kan omdirigere standard utgang til en fil som så:

  • sed '1~2d' BSD > everyother.txt

Nå åpne filen med cat:

  • cat everyother.txt

Du får samme resultat som du såg på skjermen, som tidligere:

Output
All rights reserved.Redistribution and use in source and binary forms, with or withoutare met: notice, this list of conditions and the following disclaimer. notice, this list of conditions and the following disclaimer in the3. Neither the name of the University nor the names of its contributors without specific prior written permission.. . .. . .

sed – kommandoen ikke redigere kilde filen som standard, men du kan endre dette ved å sende -i alternativ, som betyr «å utføre endringer på stedet.»Dette vil endre kilde filen.,

Advarsel: Bruk av -i bytt vil overskrive den opprinnelige filen, slik at du bør bruke det med forsiktighet. Utføre operasjoner uten -i slå først, og deretter kjøre kommandoen igjen med -i når du har det du ønsker, kan du opprette en sikkerhetskopi av den opprinnelige filen, eller omdirigere utdata til en fil. Det er veldig lett å skulle endre den opprinnelige filen med -i slå på.

La oss prøve det ved å redigere everyother.txt filen du nettopp opprettet, i-plass., La oss ytterligere til å redusere fil ved å slette alle andre linje
igjen:

  • sed -i '1~2d' everyother.txt

Hvis du bruker cat for å vise filen med cat everyother.txt, vil du se at filen har blitt redigert.

-i alternativ kan være farlig. Heldigvis, sed gir deg muligheten til å opprette en sikkerhetskopifil før redigering.,

for Å lage en backup-filen før redigering, legge til backup extension direkte etter «-jeg» – alternativet:

  • sed -i.bak '1~2d' everyother.txt

Dette skaper en backup fil med .bak forlengelse, og deretter redigerer den opprinnelige filen i stedet.

Neste du vil se på hvordan du kan bruke sed for å utføre søk og erstatt-operasjoner.

Erstatte Tekst

Kanskje den mest kjente bruk for sed er å erstatte tekst., sed kan søke etter tekst mønstre ved hjelp av regulære uttrykk, og deretter erstatte det finnes tekst med noe annet.

Du kan lære mer om regulære uttrykk ved å følge Med Grep Regulære Uttrykk for å Søke etter Tekst Mønstre i Linux.

I sin mest grunnleggende form, du kan endre et ord til et annet ord å bruke følgende syntaks:

's/old_word/new_word/'

s er skrivefeil. De tre skråstreker (/) er brukt til å skille de forskjellige felter med tekst., Du kan bruke andre tegn for å avgrense feltene på om det ville være mer nyttig.

For eksempel, hvis du prøver å endre et nettsted navn, ved hjelp av et annet skilletegn ville være nyttig siden Nettadresser som inneholder skråstreker.

– Utfør følgende kommando for å skrive ut en URL med echo og modifisere det med sed, bruk understrekingstegnet (_) tegn som skilletegn:

  • echo "http://www.example.com/index.html" | sed 's_com/index_org/home_'

Dette erstatter com/index med org/home., Utdataene viser modifed URL:

Output

Do not forget the final delimiter, or sed will complain. If you ran this command:

  • echo "http://www.example.com/index.html" | sed 's_com/index_org/home'

Du vil se denne utgang:

Output
sed: -e expression #1, char 20: unterminated `s' command

La oss opprette en ny fil for å øve noen erstatninger. Kjør følgende kommando for å lage en ny tekstfil kalt song.txt:

  • echo "this is the song that never ends
  • yes, it goes on and on, my friend
  • some people started singing it
  • not knowing what it was
  • and they'll continue singing it forever
  • just because..." > song.txt

la oss Nå erstatte uttrykket on med forward. Bruk følgende kommando:

  • sed 's/on/forward/' song.txt

output ser ut som dette:

Output
this is the sforwardg that never endsyes, it goes forward and on, my friendsome people started singing itnot knowing what it wasand they'll cforwardtinue singing it foreverjust because...

Du kan se et par viktige ting her., Først, er at sed erstattet mønstre, ikke ord. on i song er endret til forward.

Den andre tingen å merke seg er at på linje 2, den andre on ble ikke endret til forward.

Dette er på grunn av standard s – kommandoen fungerer på den første kampen i en linje, og deretter flytter til neste linje., For å gjøre sed erstatt alle forekomster av on i stedet for bare først på hver linje, må du bestå en valgfri flagget til erstatning kommando.

Gi g flagget til erstatning kommando ved å plassere den etter byttet sett:

  • sed 's/on/forward/g' song.txt

vil Du se dette utgang:

Output
this is the sforwardg that never endsyes, it goes forward and forward, my friendsome people started singing itnot knowing what it wasand they'll cforwardtinue singing it foreverjust because...

Nå skrivefeil endringer hvert tilfelle.,

Hvis du bare ønsket å endre den andre forekomsten av «på» at sed finner på hver linje, så ville du bruke nummeret 2 i stedet for g:

  • sed 's/on/forward/2' song.txt

Denne gangen de andre linjene er uendret, som de ikke har en annen forekomst:

Output
this is the song that never endsyes, it goes on and forward, my friendsome people started singing itnot knowing what it wasand they'll continue singing it foreverjust because...

Hvis du bare ønsker å se hvilke linjer som var byttet ut, kan du bruke -n valg igjen for å undertrykke automatisk utskrift.,

Du kan deretter passere p alternativ til erstatning kommandoen til å skrive ut linjer hvor substitusjon fant sted.

  • sed -n 's/on/forward/2p' song.txt

Den linje som endret skrives ut til skjermen:

Output
yes, it goes on and forward, my friend

Som du kan se, kan du kombinere flagg på slutten av kommandoen.

Hvis du vil søke i prosessen for å ignorere tilfelle, kan du sende det «jeg» – flagg.,

  • sed 's/SINGING/saying/i' song.txt

Her er det utgang vil du se følgende:

Output
this is the song that never endsyes, it goes on and on, my friendsome people started saying itnot knowing what it wasand they'll continue saying it foreverjust because...

Skifte og Referere Matchet Tekst

Hvis du ønsker å finne mer komplekse mønstre med regulære uttrykk, har du en rekke forskjellige metoder for å referere til matchet mønster i den nye teksten.,

For eksempel, for å matche fra begynnelsen av linjen til at, bruker du følgende kommando:

  • sed 's/^.*at/REPLACED/' song.txt

vil Du se dette resultatet:

Output
REPLACED never endsyes, it goes on and on, my friendsome people started singing itREPLACED it wasand they'll continue singing it foreverjust because...

Du kan se at jokertegn uttrykket samsvarer med fra begynnelsen av linjen til siste forekomst av at.

Siden du ikke vet den eksakte versjonen som samsvarer med søkestrengen, kan du bruke & tegn for å representere matchet teksten i den nye strengen.,

La oss sette parentes rundt matchet tekst:

  • sed 's/^.*at/(&)/' song.txt

vil Du se dette utgang:

Output
(this is the song that) never endsyes, it goes on and on, my friendsome people started singing it(not knowing what) it wasand they'll continue singing it foreverjust because...

En mer fleksibel måte å referere til matchet tekst er å bruke rømt parenteser til å gruppere deler av samme tekst.

Hver gruppe av søk tekst markert med parentes kan refereres til av en rømt referansenummer. For eksempel, den første parentes gruppe kan refereres til med \1, den andre med \2 og så videre.,

I dette eksempelet, vil vi slå de to første ordene på hver linje:

  • sed 's/\(*\) \(*\)/\2 \1/' song.txt

vil Du se dette utgang:

Output
is this the song that never endsyes, goes it on and on, my friendpeople some started singing itknowing not what it wasthey and'll continue singing it foreverbecause just...

Som du kan se, resultatene er ikke perfekt. For eksempel, den andre linjen hopper det første ordet fordi det har en karakter som ikke er nevnt i vår tegnsett. På samme måte er det behandlet they'll som to ord i femte linje.

La oss forbedre regulære uttrykk for å være mer nøyaktig:

  • sed 's/\(*\) \(*\)/\2 \1/' song.txt

vil Du se dette utgang:

Output
is this the song that never endsit yes, goes on and on, my friendpeople some started singing itknowing not what it wasthey'll and continue singing it foreverbecause... just

Dette er mye bedre enn forrige gang., Denne grupper tegnsetting med tilhørende ord.

legg Merke til hvordan vi gjentar uttrykket i parentes (en gang uten * karakteren, og deretter en gang med det). Dette er fordi * karakter samsvarer med tegnsettet som kommer før det null eller flere ganger. Dette betyr at den samsvarer med jokertegnet ville bli betraktet som en «kamp» selv om mønsteret er ikke funnet.

for Å sikre at sed finner teksten minst én gang, må du matche det en gang uten jokertegn før ansette jokertegn.,

Konklusjon

I denne opplæringen du utforsket sed – kommandoen. Du skrives ut spesifikke linjene fra filen, søkte for tekst, slettede linjer, overskriver den opprinnelige filen, og brukt regulære uttrykk for å erstatte tekst. Du bør være i stand til å se allerede hvordan du kan raskt forvandle et tekst-dokument ved hjelp av riktig konstruert sed-kommandoer.

I den neste artikkelen i denne serien, vil du utforske noen mer avanserte funksjoner.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *