logo

Sed Command i Linux/Unix med exempel

Linux 'sed'-kommandot står för stream editor. Den används för att redigera strömmar (filer) med hjälp av reguljära uttryck. Men denna redigering är inte permanent. Det förblir bara i displayen, men i verkligheten förblir filinnehållet detsamma.

I första hand används det för textersättning; Dessutom kan den användas för andra textmanipuleringsoperationer som infoga, ta bort, sök och mer. Kommandot sed låter oss redigera filer utan att öppna dem. Stöd för reguljära uttryck gör det till ett kraftfullare verktyg för textmanipulation.

Översikt över sed-kommandot

Det är ett Unix-verktyg som transformerar och analyserar text med ett kompakt och enkelt programmeringsspråk. Det integrerades från 1973 till 1974 av Lee E. McMahon från Bell Labs och finns idag för nästan alla operativsystem. Kommandot sed baserades på skriptaspekterna från den tidigare qed (snabbredigeraren) och den interaktiva ed-redigeraren. Det var det tidigaste verktyget för att stödja reguljära uttryck och förblir aktivt för textbehandling, viktigast av allt med ersättningskommandot. Kända alternativa verktyg inkluderar Perl och AWK för 'strömredigering' och klartext strängmanipulation.

Driftläge för sed Command

Kommandot sed är ett radorienterat verktyg för textbearbetning: det rad för rad läser text från en fil eller inmatningsström till en intern buffert som kallas mönsterrymden. Alla radläsningar börjar en cykel. Kommandot sed använder en eller flera operationer som har beskrivits av ett sed-skript till mönsterrymden. Den använder ett programmeringsspråk med cirka 25 kommandon som beskriver operationerna över texten.

För alla inmatningsrader resulterar kommandot sed vanligtvis i mönsterrymden och startar cykeln med nästa rad igen efter att ha kört skriptet. Andra end-of-script-naturer är tillgängliga från skriptkommandon och inställningsalternativ, t.ex. N för att omedelbart inkludera nästa rad i mönsterrymden, q för att avsluta, d för att ta bort mönsterutrymmet, och så vidare. Därför relaterar ett sed-skript till en loopkropp som itererar från en strömlinje, där loopvariabeln och själva loopen upprätthålls och implicit av sed.

  • Ett sed-skript kan antingen beskrivas på kommandoraden eller läsas genom en isolerad fil. I sed-skriptet kan kommandon ta en extra adress i samband med reguljära uttryck eller radnummer. Adressen avgör när kommandot exekveras. Till exempel kommer 2d endast att utföra kommandot d (eller delete) på den andra inmatningsraden, medan /^ /d tar bort varje rad som börjar med ett mellanslag.
  • Hållutrymmet, en isolerad speciell buffert, kan användas av vissa sed-kommandon för att hålla en ackumulerande text mellan cyklerna. Kommandospråket för sed har bara två variabler (mönsterrymd och hållutrymme) och GOTO-liknande förgreningsfunktionalitet. Språket är dock Turing-komplett. Esoteriska sed-skript finns tillgängliga för flera spel som tetris, schack, arkanoid och sokoban.
  • Huvudslingan körs för alla linjer i ingångsströmmen och kontrollerar sed-skriptet på alla linjer i ingången. Sed-skriptraderna är alla ett mönster-handlingspar, som representerar vilket mönster för matchning och vilken åtgärd som ska implementeras, vilket kan kopieras som ett villkorligt uttalande. Standardåtgärderna (skriv ut mönsterutrymme, kopiera linje till mönsterutrymmet), in- och utmatningsströmmar och arbetsvariabler (håll utrymme och mönsterutrymme) är implicita; det är möjligt att specificera kortfattade one-liner-program på grund av huvudslingan.

Användning av sed Command

    Ersättningskommando
    Exemplet nedan representerar den mest kommandon och typiska användningen av sed-kommandot, d.v.s. substitution. Användningen var den faktiska motivationen för sed-kommandot:
    sed 's/regexp/replacement/g' inputFileName > outputFileNameAndra kommandon av sed
    Andra sätt är också möjliga för enkel bearbetning med cirka 25 sed-kommandon. Nedan använder till exempel alternativet d för att filtrera bort rader som bara innehåller mellanslag och radens slut:
    sed '/^ *$/d' inputFileName
    I exemplet ovan används några av nedanstående reguljära uttrycksmetakaraktärer:
    • Caretten (^) är densamma som början på raden.
    • Dollarsymbolen ($) är densamma som kompletteringen av raden.
    • Asterisken (*) är samma som föregående tecken som förekom mer eller noll.
    • Plustecknet (+) är samma som ett eller flera föregående tecken.
    • Frågetecknet (?) är detsamma som föregående teckenförekomst med mer eller noll.
    • Punktsymbolen (.) är exakt samma som ett tecken.
    sed som ett filter
    Ofta används kommandot sed som filtret i en pipeline under Unix:
    $generateData | sed 's/x/y/g'
    Programmet generData genererar data, och kommandot sed gör en liten förändring genom att ersätta x i stället för y.Filbaserade sed-skript
    Ofta är det bra att lägga in många sed-kommandon, ett enda kommando per varje rad, i en skriptfil och använda -f-flaggan för att utföra kommandona från filen:
    sed -f subst.sed inputFileName > outputFileName

Syntax:

 sed [OPTION]... {script-only-if-no-other-script} [input-file]... 

Alternativ:

Följande är några kommandoradsalternativ för kommandot sed:

-n, --tyst, --tyst: Det låter oss kraftfullt skriva ut mönsterutrymme.

-e script, --expression=script: Det används för att lägga till skriptet till de kommandon som ska köras.

-f script-fil, --file=script-fil: Den används för att lägga till innehållet i skriptfilen till de kommandon som ska köras.

--följ-symbollänkar: det används för att följa symboliska länkar när bearbetning på plats.

-i[SUFFIX], --in-place[=SUFFIX]: den används för att redigera filer på plats (skapar säkerhetskopia om alternativet SUFFIX finns).

-l N, --line-length=N: Den används för att ange önskad radomslutningslängd för kommandot `l'.

--posix: den används för att inaktivera alla GNU-tillägg.

css gräns

-E, -r, --regexp-extended: Det tillåter oss att använda de utökade reguljära uttrycken i skriptet (för portabilitet använd POSIX -E).

-s, --separat: den används för att betrakta filer som separata snarare än som en enda och fortsätter den långa strömmen.

--sandlåda: Den används för att arbeta i sandlådeläge.

-u, --obuffrad: Den används för att ladda de minimala mängderna data från indatafilerna och tömmer utdatabuffertarna oftare.

-z, --null-data: Den används för att separera rader med NUL-tecken.

--hjälp: den används för att visa hjälpmanualen.

--version: Den används för att visa versionsinformation.

Exempel på sed Command

Låt oss se följande exempel:

Ansöker till STDIN-katalogen

Kommandot sed är inte bara begränsat till att manipulera filer; Vi kan också tillämpa den på STDIN-katalogen.

 echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/' 

Ovanstående kommandon kommer att ersätta den första texten med det andra textmönstret. Tänk på följande utdata:

Linux Sed-filter

Från ovanstående utdata har vi först utfört 'sed'-kommandot på en sträng 'class7' där 'class' ändras till 'jtp' och 7 till 10. Sedan har vi utfört 'sed'-kommandot på en stream 'msg.txt' ' där 'lära' omvandlas till 'studera'.

Global ersättning

I det tidigare exemplet redigerades inte alla 'lär dig' ord till 'studera'. För att redigera varje ord måste vi använda en global ersättning 'g'. Det kommer att redigera alla angivna ord i en fil eller sträng.

Syntax:

 command | sed 's///g' 

Tänk på följande exempel:

 echo class7 class9 | sed 's/class/jtp/g' cat msg.txt | sed 's/learn/study/g' 

Ovanstående kommandon kommer att ersätta alla angivna textmönster. Tänk på följande utdata:

Linux Sed-filter

Från ovanstående utdata, genom att utföra kommandot 'echo class7 class9 | sed 's/class/jtp/g'' konverteras all 'class' till 'jtp' och med kommandot 'cat msg.txt | sed 's/learn/study/g'' allt 'learn' omvandlades till 'study'.

Ta bort en linje

Alternativet 'd' låter oss ta bort en hel rad från en fil. Vi behöver bara ange ett ord från den raden med 'd'-alternativet, och den raden kommer att raderas. Men observera att alla rader som har samma ord kommer att raderas. Det kommer att utföras som:

 cat | sed '//d' 

Tänk på kommandot nedan:

 cat msg.txt | sed '/jtp/d' 

Ovanstående kommando tar bort raderna med ordet 'jtp'. Tänk på följande utdata:

Linux Sed-filter

Från ovanstående utdata, genom att utföra kommandot 'cat msg.txt | sed '/jtp/d'' raderas alla rader som innehåller ordet 'jtp'.

Använda kommandot Multiple sed

Alternativet '-e' tillåter oss att köra flera sed-kommandon samtidigt. Vi kan utföra mer än en sed-operation genom att utföra kommandot som:

 sed -e ' ; ' 

Tänk på kommandot nedan:

 sed -e 's/red/blue/; s/yellow/black/' exm.txt 

Ovanstående kommando kommer att tillämpa alla de angivna operationerna i filen 'exm.txt'. Tänk på följande utdata:

Linux Sed-filter

Som vi kan se från ovanstående utdata ersätts alla 'röda' ord med 'blå' och alla 'gula' ord ersätts med 'svarta'. Vi kan också separera kommandon så här:

 sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt 

Resultatet blir detsamma som kommandot ovan.

postorder traversal binary tree

Läsa kommandon från en fil

Vi kan spara sed-kommandona i en fil och tillämpa dem på en gång i vilken fil som helst. Det kan göras genom att ange alternativet '-f' enligt följande:

 sed -f 

Från kommandot ovan är '' en fil som har en sed-kommandolista. Tänk på kommandot nedan:

 sed -f SedCommands exm.txt 

Ovanstående kommando kommer att tillämpa alla de angivna kommandona i 'SedCommand'-filen på 'exm.txt'. Tänk på följande utdata:

Linux Sed-filter

Från ovanstående utdata har vi använt kommandon som tillämpats på det tidigare exemplet. Så utgången är densamma som i föregående exempel.

Byter ut tecken

Vi kan använda utropstecken (!) som strängavgränsare. Till exempel vill vi ersätta bash-skalet och ersätta det med csh-skalet i '/etc/passwd'. För att göra det, kör följande kommando:

 sed 's//bin/bash//bin/csh/' /etc/passwd 

Vi kan uppnå samma resultat genom att utföra följande kommando:

 sed 's!/bin/bash!/bin/csh!' /etc/passwd 

Begränsa sed

Den grundläggande användningen av sed-kommandot bearbetar hela filen. Men vi kan begränsa kommandot sed och specificera vilken rad som helst. Det finns två sätt att begränsa kommandot sed:

iPhone emojis på Android-telefon
  • En rad rader.
  • Ett mönster som matchar en specifik linje.

Vi kan tillhandahålla ett nummer för att specificera en rad enligt följande:

 sed '3s/Red/Blue/' exm.txt 

Ovanstående kommando kommer att tillämpa den angivna operationen på den tredje raden. Tänk på följande utdata:

Linux Sed-filter

Från ovanstående utgång modifieras endast rad tre.

Vi kan också specificera ett antal rader. För att ange ett radintervall, kör kommandot enligt följande:

 sed '1,3s/Red/Blue/' exm.txt 

Ovanstående kommando kommer att uppdatera den angivna texten på rad 1 och 3. Tänk på följande utdata:

Linux Sed-filter

Infoga och lägga till text

Flaggan 'i' och 'a' används för att infoga och lägga till text i en fil. 'i'-flaggan lägger till texten före strängen, och 'a'-flaggan används för att lägga till text efter strängen. Tänk på kommandot nedan:

 echo 'Another Demo' | sed 'iFirst Demo' 

Ovanstående kommando kommer att infoga texten före texten 'Another Demo'. Tänk på följande utdata:

Linux Sed-filter

För att lägga till text, kör kommandot enligt följande:

 echo 'Another Demo' | sed 'aFirst Demo' 

Ovanstående kommando kommer att lägga till texten. Tänk på följande utdata:

Linux Sed-filter

Ändra linjer

Flaggan 'c' används för att modifiera en specifik rad. För att ändra en rad, kör kommandot enligt följande:

 sed '3cThis is a modified line.' exm.txt 

Kommandot ovan kommer att uppdatera rad tre. Tänk på följande utdata:

Linux Sed-filter

Vi kan också använda ett reguljärt uttryck för att uppdatera mer än en rad med samma mönster. Tänk på kommandot nedan:

 sed '/Apple is /c Line updated.' exm.txt 

Ovanstående kommando kommer att uppdatera alla rader med strängen 'Apple is'. Tänk på följande utdata:

Linux Sed-filter

Förvandling av karaktärer

'y'-flaggan används för att transformera karaktärerna. Omvandlingen av tecken kan inte begränsas till specifika händelser. För att transformera tecken, kör kommandot enligt följande:

 sed 'y/abc/def/' exm.txt 

Kommandot ovan kommer att omvandla tecknen 'a', 'b', 'c' till 'd', 'e', ​​'f'. överväg nedanstående utdata:

Linux Sed-filter

Skriva ut radnumren

Tecknet '=' används för att skriva ut radnumret. För att skriva ut radnumret, utför kommandot enligt följande:

 sed '=' exm.txt 

Kommandot ovan visar radnumret för filinnehållet. Tänk på följande utdata:

Linux Sed-filter

Likhetstecknet med alternativet '-n' anger radnumret som innehåller ett matchande skript. Tänk på följande utdata:

 sed -n '/mango/=' exm.txt 

Ovanstående kommando visar radnumret som innehåller ordet 'mango'. Tänk på följande utdata:

Linux Sed-filter

Från ovanstående utdata kan vi se rad nummer 2 har ordet 'mango'.