Welcome to Our Website

Den Grundlæggende Brug af Sed Stream Editor til at Manipulere Tekst i Linux

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:

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.......

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:

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, 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:

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 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
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 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:

Output
Copyright (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:

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 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:

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 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:

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 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:

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 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:

Output
sed: -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:

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 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 onikke æ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:

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...

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:

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 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:

Output
yes, 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:

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...

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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *