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
.
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:
OutputCopyright (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:
OutputCopyright (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:
OutputCopyright (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
OutputCopyright (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:
OutputCopyright (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:
OutputCopyright (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:
OutputCopyright (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:
OutputAll 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:
OutputAll 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:
Outputsed: -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:
Outputthis 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:
Outputthis 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:
Outputthis 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:
Outputyes, 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:
Outputthis 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.