Indledning
sed
kommando, kort for stream editor, udfører redigering operationer på tekst, der kommer fra standard-ind eller en fil. sed
Redigerer linje for linje og på en ikke-interaktiv måde.
dette betyder, at du foretager alle redigeringsbeslutningerne, som du kalder kommandoen, og sed
udfører anvisningerne automatisk., Dette kan virke forvirrende eller uintuitivt, men det er en meget kraftfuld og hurtig måde at transformere tekst på, især som en del af et script eller en automatiseret arbejdsgang.
denne vejledning dækker nogle grundlæggende operationer og introducerer dig til den syntaks, der kræves for at betjene denne editor. Du vil næsten helt sikkert aldrig erstatte din almindelige teksteditor med sed
, men det vil sandsynligvis blive en velkommen tilføjelse til din tekstredigeringsværktøjskasse.Bemærk: Denne vejledning bruger GNU-versionen af sed
fundet på Ubuntu og andre Linu. – operativsystemer., Hvis du bruger macOS, har du BSD-versionen, der har forskellige muligheder og argumenter. Du kan installere GNU-versionen af sed
med Homebre.ved hjælp af brew install gnu-sed
.Start en interaktiv Terminal!
grundlæggende brug
sed
fungerer på en strøm af tekst, som den læser fra enten en tekstfil eller fra standard input (STDIN). Dette betyder, at du kan sende output fra en anden kommando direkte til sed til redigering, eller du kan arbejde på en fil, som du allerede har oprettet.,
Du skal også være opmærksom på, at sed
udsender alt til standard out (STDOUT) som standard. Det betyder, at, medmindre omdirigeret, sed
vil udskrive sin output til skærmen i stedet for at gemme det i en fil.
grundlæggende brug er:
- sed commands
I denne tutorial, vil du bruge en kopi af BSD-Software Licens til at eksperimentere med sed
., På Ubuntu, skal du køre følgende kommando for at kopiere den BSD-licens-filen til din hjemmemappe, så du kan arbejde med:
- cd
- cp /usr/share/common-licenses/BSD .
Hvis du ikke har en lokal kopi af BSD-licens, skal du oprette en selv med denne kommando:
- 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
Lad os bruge sed
for at få vist indholdet af BSD-licens-fil. sed
sender sine resultater til skærmen som standard, hvilket betyder at du kan bruge det som en fillæser ved at sende det ingen redigeringskommandoer., Prøv at udføre følgende kommando:
- sed '' BSD
Du vil se, BSD-licens, der vises på skærmen:
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.......
anførselstegn indeholde redigering af kommandoer, som du videregiver til sed
. I dette tilfælde har du ikke bestået det, så sed
udskrevet hver linje, den modtog til standardudgang.
sed
kan bruge standard input snarere end en fil., Rør produktionen af cat
kommando i sed
for at producere det samme resultat:
- cat BSD | sed ''
Du vil se produktionen af 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, at du kan operere på filer eller strømme af tekst, som dem, der produceres, når rør output med røret (|)
karakter, lige så nemt.
Udskrivningslinjer
i det foregående eksempel så du, at input blev overført tilsed
uden nogen operationer ville udskrive resultaterne direkte til standardudgang.,
Lad os udforske sed
‘s eksplicitte print
kommando, som du angiver ved hjælp af p
karakter inden for enkelt-anførselstegn.
Udføre følgende kommando:
- sed 'p' BSD
Du kan se hver linje i BSD
fil, trykkes to gange:
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 udskriver hver linje som standard, og så har du fortalt det til at udskrive linjer eksplicit med “p” kommando, så får du hver linje trykkes to gange.,
Hvis du undersøger output nøje, vil du se, at det er den første linje to gange, efterfulgt af den anden linje to gange, osv., som fortæller dig, at sed
opererer på data linje for linje. Den læser en linje, fungerer på den og udsender den resulterende tekst, før processen gentages på næste linje.
Du kan rydde op på resultaterne ved at passere -n
mulighed for at sed
, som undertrykker automatisk udskrivning:
- 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 er nu tilbage til udskrivning hver linje gang.,
eksemplerne hidtil kan næppe betragtes som redigering (medmindre du ville udskrive hver linje to gange…). Derefter vil du undersøge, hvordan sed
kan ændre output ved at målrette bestemte sektioner af tekstdataene.
ved hjælp af adresseområder
adresser kan du målrette mod bestemte dele af en tekststrøm. Du kan angive en bestemt linje eller endda en række linjer.
lad os have sed
udskriv den første linje i filen., Udfør følgende kommando:
- sed -n '1p' BSD
Den første linje, der udskrives til skærmen:
OutputCopyright (c) The Regents of the University of California.
Ved at placere antallet 1
før kommandoen udskriv, du fortalte sed
linjen nummer til at operere på. Du kan lige så nemt at printe fem linjer (glem ikke det “-n”):
- sed -n '1,5p' BSD
Du vil se dette output:
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 lige givet et adresseområde til sed
., Hvis du giver sed
en adresse, vil den kun udføre de kommandoer, der følger på disse linjer. I dette eksempel har du bedt sed om at udskrive linje 1 til linje 5. Kunne du have angivet denne på en anden måde, ved at give den første adresse og derefter brug af en offset til at fortælle, sed, hvor mange ekstra linjer til at rejse, som dette:
- sed -n '1,+4p' BSD
Dette vil resultere i den samme effekt, fordi du fortalte sed
for at starte på linie 1 og derefter operere på de næste 4 linjer.,
Hvis du vil udskrive hver anden linje, skal du angive intervallet efter ~
tegn. Følgende kommando udskriver hver anden linje i BSD
fil, begyndende med linje 1:
- sed -n '1~2p' BSD
Her er den effekt du vil se:
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 bruge sed
for at slette tekst fra output så godt.,
Sletning af Tekst
Du kan udføre tekst sletning, hvor du tidligere var at angive tekst udskrivning ved at ændre p
kommandoen d
kommandoen.
i dette tilfælde behøver du ikke længere kommandoen -n
, fordi sed
udskriver alt, hvad der ikke er slettet. Dette vil hjælpe dig med at se, hvad der foregår.,
Ændrer den sidste kommando fra forrige afsnit for at gøre det
slette hver anden linje, der begynder med den første:
- sed '1~2d' BSD
resultatet er, at du kan se hver linje, du ikke fik sidste 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 vigtigt at bemærke her, at vores kilde filen ikke bliver påvirket. Det er stadig intakt. Redigeringerne udsendes til vores skærm.,
Hvis vi ønsker at redde vores redigeringer, vi kan omdirigere standard output til en fil som så:
- sed '1~2d' BSD > everyother.txt
Nu skal du åbne filen med cat
:
- cat everyother.txt
Du ser det samme output, som du så på skærmen, der tidligere er:
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
kommando ikke redigere kilde fil som standard, men du kan ændre denne funktionsmåde ved at passere -i
option, som betyder “at udføre ændringer i et-sted.”Dette vil ændre kildefilen.,
Advarsel: Brug af-i
s switchitch overskriver den originale fil, så du skal bruge denne med omhu. Udføre operationer uden -i
skift først og derefter køre kommandoen igen med -i
, når du har hvad du ønsker, skal du oprette en sikkerhedskopi af den oprindelige fil, eller omdirigere outputtet til en fil. Det er meget nemt at ved et uheld ændre den oprindelige fil med -i
s .itch.
lad os prøve det ved at redigere everyother.txt
fil, du lige har oprettet, på stedet., Lad os yderligere reducere den fil, ved at slette hver anden linje
igen:
- sed -i '1~2d' everyother.txt
Hvis du bruger cat
for at få vist den fil med cat everyother.txt
, vil du se, at filen er blevet redigeret.
-i
indstillingen kan være farlig. Heldigvis giver sed
dig muligheden for at oprette en sikkerhedskopifil inden redigering.,
for at oprette en sikkerhedskopifil inden redigering skal du tilføje sikkerhedskopiudvidelsen direkte efter indstillingen “-i”:
- sed -i.bak '1~2d' everyother.txt
dette opretter en sikkerhedskopifil med .bak
og redigerer derefter den originale fil på stedet.
næste vil du se på, hvordan du bruger sed
til at udføre søgning og erstatte operationer.
udskiftning af tekst
den mest kendte anvendelse afsed
erstatter måske tekst., sed
kan søge efter tekstmønstre ved hjælp af regulære udtryk og derefter erstatte den fundne tekst med noget andet.
Du kan lære mere om regulære udtryk ved at følge brugen af grep regulære udtryk for at søge efter tekstmønstre i Linu..
I sin mest basale form, kan du ændre et ord til et andet ord ved hjælp af følgende syntaks:
's/old_word/new_word/'
s
er den stedfortrædende kommando. De tre skråstreger (/
) bruges til at adskille de forskellige tekstfelter., Du kan bruge andre tegn til at afgrænse felterne, hvis det ville være mere nyttigt.hvis du for eksempel forsøgte at ændre et websiteebstedsnavn, ville det være nyttigt at bruge en anden afgrænsning, da Urebadresser indeholder skråstreger.
Udføre følgende kommando for at udskrive en URL med echo
og ændre det med sed
, brug understregningstegn (_
) karakter som skilletegn:
- echo "http://www.example.com/index.html" | sed 's_com/index_org/home_'
Dette træder i stedet for com/index
med org/home
., Output viser ændret 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 må se denne udgang:
Outputsed: -e expression #1, char 20: unterminated `s' command
Lad os oprette en ny fil til at øve nogle udskiftninger. Kør den følgende kommando for at oprette en ny tekst-fil, der hedder 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
lad os Nu erstatte udtrykket on
med forward
. Brug følgende kommando:
- sed 's/on/forward/' song.txt
udgangen ser sådan ud:
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 bemærkelsesværdige ting her., For det første er det sed
erstattede mønstre, ikke ord. on
inden for song
ændres til forward
.
den anden ting at bemærke er, at på linje 2 blev den anden on
ikke ændret til forward
.
dette skyldes som standard kommandoen s
fungerer på den første kamp i en linje og flytter derefter til den næste linje., For at lave sed
udskift hver forekomst af on
i stedet for kun den første på hver linje, skal du sende et valgfrit flag til kommandoen erstatning.
Giver g
flag til erstatning kommando ved at placere det efter substitution sæt:
- sed 's/on/forward/g' song.txt
Du vil se dette output:
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...
Nu erstatning kommando skifter hver instans.,
Hvis du kun ønsker at ændre den anden forekomst af “om”, at sed finder på hver linje, og derefter du vil bruge antallet 2
i stedet for g
:
- sed 's/on/forward/2' song.txt
Denne gang er de andre linjer er uændret, da de ikke har en anden 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 kun ønsker at se, hvilke linjer, der blev udskiftet, skal du bruge -n
option (valgmuligheder) igen for at undertrykke automatisk udskrivning.,
Du kan derefter overføre p
til kommandoen erstatning for at udskrive linjer, hvor substitution fandt sted.
- sed -n 's/on/forward/2p' song.txt
linjen, der ændrede udskrifter til skærmen:
Outputyes, it goes on and forward, my friend
som du kan se, kan du kombinere flagene i slutningen af kommandoen.
Hvis du vil have søgeprocessen til at ignorere sag, kan du sende det “i” flag.,
- sed 's/SINGING/saying/i' song.txt
Her er den effekt du vil se:
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...
Udskiftning og Refererer til matchende Tekst
Hvis du ønsker at finde mere komplekse mønstre med regulære udtryk, du har en række forskellige metoder til at referere den matchede mønster i erstatningsteksten.,
For eksempel, at kampen fra begyndelsen af linjen at
, skal du bruge følgende kommando:
- sed 's/^.*at/REPLACED/' song.txt
Du vil se dette output:
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 jokertegnsudtryk kampe fra begyndelsen af linjen til den sidste forekomst af at
.
Da du ikke kender den nøjagtige sætning, der vil matche i søgestrengen, kan du bruge &
karakter til at repræsentere den matchende tekst i erstatningsstrengen.,
Lad os sætte en parentes rundt om den matchende tekst:
- sed 's/^.*at/(&)/' song.txt
Du vil se dette output:
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 mere fleksibel måde at referere til matchende tekst er at bruge undslap parenteser til at gruppere dele af matchende tekst.
hver gruppe af søgetekst markeret med parenteser kan refereres til af et rømt referencenummer. For eksempel kan den første parentesegruppe refereres med \1
, den anden med \2
og så videre.,
I dette eksempel, vil vi skifte de to første ord i hver linje:
- sed 's/\(*\) \(*\)/\2 \1/' song.txt
Du vil se dette output:
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, er resultaterne ikke er perfekte. For eksempel springer den anden linje over det første ord, fordi det har et tegn, der ikke er angivet i vores tegnsæt. Tilsvarende behandlede den they'll
som to ord i femte linje.
Lad os forbedre det regulære udtryk for at være mere præcis:
- sed 's/\(*\) \(*\)/\2 \1/' song.txt
Du vil se dette output:
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 meget bedre end sidste gang., Dette grupperer tegnsætning med det tilhørende ord.
bemærk, hvordan vi gentager udtrykket inde i parenteserne (en gang uden*
karakter og derefter en gang med det). Dette skyldes, at *
tegn matcher det tegnsæt, der kommer før det nul eller flere gange. Det betyder, at kampen med wildildcard ville blive betragtet som en” match”, selvom mønsteret ikke findes.
for at sikre, At sed
finder teksten mindst én gang, skal du matche det en gang uden wildcard før ansætte wildcard.,
konklusion
i denne vejledning udforskede du kommandoensed
. Du udskrev bestemte linjer fra filen, søgte efter tekst, slettede linjer, omskrev den originale fil og brugte regulære udtryk til at erstatte tekst. Du skal allerede kunne se, hvordan du hurtigt kan omdanne et tekstdokument ved hjælp af korrekt konstruerede sed-kommandoer.
i den næste artikel i denne serie vil du udforske nogle mere avancerede funktioner.