Welcome to Our Website

Grunderna för att använda Sed Stream Editor för att manipulera Text i Linux

introduktion

kommandot sed, kort för stream editor, utför redigeringsåtgärder på text som kommer från standardinmatning eller en fil. sed redigerar rad för rad och på ett icke-interaktivt sätt.

det betyder att du gör alla redigeringsbeslut när du anropar kommandot, ochsed utför anvisningarna automatiskt., Detta kan tyckas förvirrande eller ointuitive, men det är ett mycket kraftfullt och snabbt sätt att omvandla text, särskilt som en del av ett skript eller automatiserat arbetsflöde.

den här handledningen kommer att täcka några grundläggande operationer och introducera dig till den syntax som krävs för att använda den här redigeraren. Du kommer nästan säkert aldrig att ersätta din vanliga textredigerare med sed, men det kommer förmodligen att bli ett välkommet tillägg till din textredigeringsverktygslåda.

Obs! den här handledningen använder GNU-versionen avsed som finns på Ubuntu och andra Linux-operativsystem., Om du använder macOS har du BSD-versionen som har olika alternativ och argument. Du kan installera GNU-versionen av sed med Homebrew med brew install gnu-sed.

starta en interaktiv Terminal!

Grundläggande användning

sed fungerar på en ström av text som den läser från antingen en textfil eller från standard input (STDIN). Det innebär att du kan skicka utdata från ett annat kommando direkt till sed för redigering, eller du kan arbeta på en fil som du redan har skapat.,

Du bör också vara medveten om att sed matar ut allt till standard ut (STDOUT) som standard. Det betyder att sed, om det inte omdirigeras, kommer att skriva ut sin utmatning till skärmen istället för att spara den i en fil.

den grundläggande användningen är:

  • sed commands

i den här handledningen använder du en kopia av BSD-Programlicensen för att experimentera medsed., På Ubuntu, kör följande kommandon för att kopiera BSD-licensfilen till din hemkatalog så att du kan arbeta med den:

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

om du inte har en lokal kopia av BSD-licensen, skapa en själv med det här kommandot:

  • 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

låt oss använda sed för att visa innehållet i BSD-licensfilen. – herr talman! sed skickar sina resultat till skärmen som standard, vilket innebär att du kan använda den som en filläsare genom att skicka den inga redigeringskommandon., Prova att köra följande kommando:

  • sed '' BSD

du ser BSD-licensen som visas 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.......

de enskilda citaten innehåller de redigeringskommandon du skickar tillsed. I det här fallet skickade du det ingenting, så sed skrev ut varje rad som den mottog till standardutmatning.

sed kan använda standardinmatning snarare än en fil., Pipa utdata från cat kommandot till sed för att producera samma resultat:

  • cat BSD | sed ''

du ser utdata från 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 arbeta på filer eller strömmar av text, som de som produceras när du använder iv id=”rörledning utgång med röret(|) karaktär, lika enkelt.

Utskriftslinjer

i föregående exempel såg du att inmatningen gick in ised utan några åtgärder skulle skriva ut resultaten direkt till standardutmatning.,

låt oss utforskased’s explicitprint – kommandot, som du anger genom att användap – tecknet inom enskilda citat.

utför följande kommando:

  • sed 'p' BSD

du ser varje rad i filenBSD som skrivs ut två gånger:

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 skriver automatiskt ut varje rad som standard, och sedan har du sagt till den att skriva ut rader explicit med den ”p” – kommandot, så du får varje rad tryckt två gånger.,

om du granskar utmatningen noga ser du att den har den första raden två gånger, följt av den andra raden två gånger, etc, som berättar att sed fungerar på datalinje för rad. Den läser en rad, fungerar på den och matar ut den resulterande texten innan du upprepar processen på nästa rad.

Du kan rensa resultaten genom att skicka-n alternativet tillsed, vilket undertrycker den automatiska utskriften:

  • 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 är nu tillbaka för att skriva ut varje rad en gång.,

exemplen hittills kan knappast betraktas som redigering (om du inte ville skriva ut varje rad två gånger…). Därefter utforskar du hur sed kan ändra utmatningen genom att rikta in specifika delar av textdata.

med adressområden

adresser kan du rikta in specifika delar av en textström. Du kan ange en viss rad eller till och med ett radintervall.

låt oss hased Skriv ut den första raden i filen., Utför följande kommando:

  • sed -n '1p' BSD

den första raden skriver ut på skärmen:

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

genom att placera numret1 innan utskriftskommandot sa du tillsed radnumret som ska användas på. Du kan lika enkelt skriva ut fem rader (glöm inte ”-n”):

  • sed -n '1,5p' BSD

du ser den här utmatningen:

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 just gett ett adressområde till sed., Om du gersed en adress, kommer den bara att utföra de kommandon som följer på dessa rader. I det här exemplet har du sagt till sed att skriva ut linje 1 till linje 5. Du kunde ha angett detta på ett annat sätt genom att ange den första adressen och sedan använda en förskjutning för att berätta för sed hur många ytterligare linjer som ska resa, så här:

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

detta kommer att resultera i samma utgång, eftersom du berättade för sed att börja på rad 1 och sedan arbeta på de följande 4 linjerna också.,

om du vill skriva ut alla andra rader anger du intervallet efter tecknet~. Följande kommando skriver ut varannan rad i filen BSD, som börjar med Rad 1:

  • sed -n '1~2p' BSD

här är utmatningen du ser:

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 också använda sed för att radera text från utmatningen.,

ta bort Text

Du kan radera text där du tidigare angav textutskrift genom att ändra kommandotp till kommandotd.

i det här fallet behöver du inte längre kommandot-n eftersomsed skriver ut allt som inte raderas. Detta hjälper dig att se vad som händer.,

ändra det senaste kommandot från föregående avsnitt för att göra det
ta bort alla andra rader som börjar med den första:

  • sed '1~2d' BSD

resultatet är att du ser varje rad du inte fick förra gången:

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 är viktigt att notera här att vår källfil inte påverkas. Den är fortfarande intakt. Redigeringarna matas ut till vår skärm.,

om vi vill spara våra redigeringar kan vi omdirigera standardutmatning till en fil som så:

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

Öppna nu filen med cat:

  • cat everyother.txt

du ser samma utmatning som du såg på skärmen tidigare:

  • cat everyother.txt

du ser samma utmatning som du såg på skärmen tidigare:

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

kommandot sed redigerar inte källfilen som standard, men du kan ändra detta beteende genom att skicka alternativet -i, vilket betyder ” utför redigeringar på plats.”Detta kommer att ändra källfilen.,

varning: om du använder växeln-iskrivs den ursprungliga filen över, så använd den försiktigt. Utför operationerna utan-i – växeln först och kör sedan kommandot igen med -i när du har vad du vill, skapa en säkerhetskopia av den ursprungliga filen eller omdirigera utmatningen till en fil. Det är väldigt lätt att oavsiktligt ändra originalfilen med-i – omkopplaren.

låt oss prova det genom att redigera fileneveryother.txt som du just skapat, på plats., Låt oss ytterligare minska filen genom att ta bort alla andra rader
igen:

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

om du använder cat för att visa filen med cat everyother.txt ser du att filen har redigerats.

alternativet-i kan vara farligt. Tack och lov, sed ger Dig möjlighet att skapa en säkerhetskopia innan du redigerar.,

för att skapa en säkerhetskopia innan du redigerar, Lägg till tillägget backup direkt efter alternativet”- i”:

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

detta skapar en säkerhetskopia med tillägget .bak och redigerar sedan den ursprungliga filen på plats.

nästa kommer du att titta på hur du använder sed för att utföra Sök och ersätta operationer.

ersätta Text

kanske den mest kända användningen försed ersätter text., sed kan söka efter textmönster med reguljära uttryck och sedan ersätta den hittade texten med något annat.

Du kan läsa mer om reguljära uttryck genom att följa med Grep reguljära uttryck för att söka efter textmönster i Linux.

i sin mest grundläggande form kan du ändra ett ord till ett annat ord med följande syntax:

's/old_word/new_word/'

s är ersättningskommandot. De tre snedstrecken (/) används för att separera de olika textfälten., Du kan använda andra tecken för att avgränsa fälten om det skulle vara mer användbart.

om du till exempel försökte ändra ett webbplatsnamn skulle det vara bra att använda en annan avgränsare eftersom webbadresser innehåller snedstreck.

utför följande kommando för att skriva ut en URL med echo och ändra den med sed, med hjälp av understrecket (_) tecken som avgränsare:

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

detta ersätter com/index med org/home., Utmatningen visar den modifierade webbadressen:

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 skulle se den här utmatningen:

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

låt oss skapa en ny fil för att öva några substitutioner. Utför följande kommando för att skapa en ny textfil som hetersong.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

låt oss nu ersätta uttrycketon medforward. Använd följande kommando:

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

utgången ser ut så här:

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 några anmärkningsvärda saker här., För det första är att sed ersatte mönster, inte ord. on inomsong ändras tillforward.

det andra att märka är att på rad 2 ändrades inte den andra on till forward.

detta beror på att kommandots som standard fungerar på den första matchen i en rad och sedan flyttas till nästa rad., För att göra sed ersätt varje instans av on istället för bara den första på varje rad måste du skicka en valfri flagga till ersättningskommandot.

Ange flaggang till ersättningskommandot genom att placera den efter substitutionsuppsättningen:

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

du ser den här utmatningen:

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 ändras ersättningskommandot varje instans.,

om du bara ville ändra den andra instansen av ”on” som sed hittar på varje rad, Skulle du använda numret 2 istället för g:

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

den här gången är de andra raderna oförändrade, eftersom de inte har någon andra förekomst:

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

den här gången är de andra raderna oförändrade, eftersom de inte har någon andra förekomst:

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

om du bara vill se vilka rader som ersattes, använd alternativet -n igen för att undertrycka automatisk utskrift.,

Du kan sedan skicka alternativetp till ersätt kommandot för att skriva ut rader där substitution ägde rum.

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

raden som ändrade utskrifter till skärmen:

Output
yes, it goes on and forward, my friend

som du kan se kan du kombinera flaggorna i slutet av kommandot.

om du vill att sökprocessen ska ignorera kundcase kan du skicka flaggan ”i”.,

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

här är utgången du ser:

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

ersätta och referera matchad Text

om du vill hitta mer komplexa mönster med reguljära uttryck, har du ett antal olika metoder för att referera till det matchade mönstret i ersättningstexten.,

till exempel, för att matcha från början av raden till at, använd följande kommando:

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

du ser den här utmatningen:

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 att jokertuttrycket Matchar från början av raden till den sista instansen av at.

eftersom du inte känner till den exakta frasen som matchar i söksträngen kan du använda tecknet& för att representera den matchade texten i ersättningssträngen.,

låt oss sätta parenteser runt den matchade texten:

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

du ser den här utmatningen:

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

ett mer flexibelt sätt att referera till matchad text är att använda förrymda parenteser till gruppsektioner av matchad text.

varje grupp av söktext markerad med parenteser kan refereras av ett förrymt referensnummer. Till exempel kan den första parentesgruppen refereras med \1, den andra med \2 och så vidare.,

i det här exemplet byter vi de två första orden i varje rad:

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

du ser den här utmatningen:

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 är resultaten inte perfekta. Den andra raden hoppar till exempel över det första ordet eftersom det har ett tecken som inte anges i vår teckenuppsättning. På samma sätt behandlade den they'll som två ord i femte raden.

låt oss förbättra det reguljära uttrycket för att vara mer exakt:

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

du ser den här utmatningen:

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

det här är mycket bättre än förra gången., Detta grupperar skiljetecken med det associerade ordet.

Lägg märke till hur vi upprepar uttrycket inom parenteserna (en gång utan tecknet * och sedan en gång med det). Detta beror på att tecknet * matchar teckenuppsättningen som kommer före noll eller flera gånger. Detta innebär att matchen med jokertecknet skulle betraktas som en” match ” även om mönstret inte hittas.

för att se till attsed hittar texten minst en gång måste du matcha den en gång utan jokertecknet innan du använder jokertecknet.,

slutsats

i den här handledningen utforskade du kommandotsed. Du skrev ut specifika rader från filen, sökte efter text, raderade rader, överskred originalfilen och använde reguljära uttryck för att ersätta text. Du bör kunna se redan hur du snabbt kan omvandla ett textdokument med korrekt konstruerade sed-kommandon.

i nästa artikel i denna serie kommer du att utforska några mer avancerade funktioner.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *