sed - sed

sed
Paradigm skript
Designad av Lee E. McMahon
Första gången dök upp 1974 ; 47 år sedan ( 1974 )
Implementeringsspråk C
Hemsida www .gnu .org /software /sed /
Påverkad av
red
Påverkad
Perl , AWK

sed ("stream editor") är ett Unix -verktyg som analyserar och transformerar text med ett enkelt, kompakt programmeringsspråk. sed utvecklades från 1973 till 1974 av Lee E. McMahon från Bell Labs och är idag tillgängligt för de flesta operativsystem. sed baserades på skriptfunktionerna i den interaktiva redaktören ed ("editor", 1971) och den tidigare qed ("quick editor", 1965–66). sed var ett av de tidigaste verktygen för att stödja reguljära uttryck och används fortfarande för textbehandling, framför allt med substitutionskommandot. Populära alternativa verktyg för manipulering av klartextsträngar och "strömredigering" inkluderar AWK och Perl .

Historia

Visades först i version 7 Unix , sed är ett av de tidiga Unix -kommandona som är byggda för kommandoradsbehandling av datafiler. Det utvecklades som den naturliga efterföljaren till det populära grep -kommandot. Den ursprungliga motivationen var en analog av grep (g/re/p) för substitution, därav "g/re/s". Förutse att ytterligare specialprogram för varje kommando också skulle uppstå, till exempel g/re/d, skrev McMahon en general-purpose line-orienterad strömredigerare, som blev sed. Syntaxen för sed, särskilt användningen av /för mönstermatchning och s///för substitution, härstammar från ed , föregångaren till sed, som var vanlig vid den tiden, och det reguljära uttryckssyntaxen har påverkat andra språk, särskilt ECMAScript och Perl . Senare utvecklades det mer kraftfulla språket AWK , och dessa fungerade som kusiner, vilket möjliggjorde kraftfull textbehandling med skalskript . sed och AWK citeras ofta som föregångare och inspiration för Perl, och påverkade Perls syntax och semantik, särskilt i matchnings- och substitutionsoperatörerna.

GNU sed har lagt till flera nya funktioner, inklusive redigering på plats av filer. Super-sed är en utökad version av sed som innehåller reguljära uttryck som är kompatibla med Perl . En annan variant av sed är miniserad , ursprungligen ombyggd från 4.1BSD sed av Eric S. Raymond och för närvarande underhålls av René Rebe . minised användes av GNU -projektet tills GNU -projektet skrev en ny version av sed baserat på det nya GNU -reguljära uttrycksbiblioteket. Den nuvarande miniserade innehåller några tillägg till BSD sed men är inte lika funktionsrik som GNU sed. Dess fördel är att den är väldigt snabb och använder lite minne. Den används på inbäddade system och är den version av sed som medföljer Minix .

Driftsätt

sed är ett radorienterat textbehandlingsverktyg: det läser text, rad för rad, från en ingångsström eller fil, till en intern buffert som kallas mönsterutrymme . Varje radavläsning startar en cykel . På mönsterutrymmet tillämpar sed en eller flera operationer som har specificerats via ett sed -skript . sed implementerar ett programmeringsspråk med cirka 25 kommandon som specificerar operationerna på texten. För varje inmatningsrad, efter att manuset har körts, matar sed normalt ut mönsterutrymmet (raden som modifierad av skriptet) och börjar cykeln igen med nästa rad. Andra end-of-script-beteenden är tillgängliga genom alternativ och skriptkommandon, t.ex. för datt radera mönsterutrymmet, qsluta, Nlägga till nästa rad i mönsterutrymmet omedelbart och så vidare. Således motsvarar ett sed -skript kroppen av en slinga som itererar genom strömmens linjer, där själva slingan och slingvariabeln (det aktuella linjenumret) är implicit och underhålls av sed.

Sed -skriptet kan antingen anges på kommandoraden ( -ealternativ) eller läsas från en separat fil ( -falternativ). Kommandon i sed -skriptet kan ta en valfri adress, vad gäller radnummer eller reguljära uttryck . Adressen avgör när kommandot körs. Till exempel 2dkörs bara d(delete) -kommandot på den andra inmatningsraden (skriver ut alla rader utom den andra), medan /^ /dalla rader som börjar med ett mellanslag raderas. En separat speciell buffert, lagringsutrymmet , kan användas av några få kommandon för att hålla och ackumulera text mellan cykler. seds kommandospråk har bara två variabler ("håll utrymmet" och "mönsterutrymmet") och GOTO -liknande förgreningsfunktion; Ändå är språket Turing-komplett , och det finns esoteriska sed-skript för spel som sokoban , arkanoid , schack och tetris .

En huvudslinga körs för varje rad i ingångsströmmen och utvärderar sed -skriptet på varje rad i ingången. Rader i ett sed-skript är var och ett ett mönster-åtgärdspar, vilket indikerar vilket mönster som ska matchas och vilken åtgärd som ska utföras, vilket kan omformas som ett villkorligt uttalande . Eftersom huvudslingan, arbetsvariabler (mönsterutrymme och rymdutrymme), in- och utmatningsströmmar och standardåtgärder (kopieringsrad till mönsterutrymme, utskriftsmönsterutrymme) är implicita, är det möjligt att skriva kortfattade program med en rad . Till exempel sed programmet som ges av:

10q

kommer att skriva ut de första tio inmatningsraderna och sedan stoppa.

Användande

Ersättningskommando

Följande exempel visar en typisk och vanligaste användning av sed: substitution. Denna användning var verkligen den ursprungliga motivationen för sed:

sed 's/regexp/replacement/g' inputFileName > outputFileName

I vissa versioner av sed måste uttrycket föregås av för -eatt indikera att ett uttryck följer. Den sstår för ersättning, medan gstår för global, vilket innebär att alla matchande förekomster i raden skulle bytas ut. Det reguljära uttrycket (dvs. mönstret) som ska sökas placeras efter den första avgränsningssymbolen (snedstreck här) och ersättningen följer den andra symbolen. Slash ( /) är den konventionella symbolen, med ursprung i tecknet för "sök" i ed, men vilken annan som helst kan användas för att göra syntaxen mer läsbar om den inte förekommer i mönstret eller ersättningen; detta är användbart för att undvika " lutande tandpetarsyndrom ".

Substitutionskommandot, som har sitt ursprung i sök-och-ersätt i ed, implementerar enkel analys och mallning . Den regexpger både mönstermatchning och spara text via under uttryck, medan replacementkan vara antingen bokstav text eller en formatsträng som innehåller tecknen &för "hela matchen" eller speciella escape-sekvenser \1 genom \9för n : te sparade sub-uttryck. Till exempel sed -r "s/(cat|dog)s?/\1s/g"ersätter alla förekomster av "katt" eller "hund" med "katter" eller "hundar", utan att duplicera ett befintligt "s": (cat|dog)är det första (och enda) sparade underuttrycket i regexp och \1i formatet sträng ersätter detta i utdata.

Andra sedkommandon

Förutom substitution är andra former av enkel bearbetning möjliga med 25 sed -kommandon. Till exempel använder följande kommandot d för att filtrera bort rader som bara innehåller mellanslag, eller bara innehåller slutet av radtecknet:

sed '/^ *$/d' inputFileName

I det här exemplet används några av följande metatecken för reguljära uttryck (sed stöder hela spektrumet av reguljära uttryck):

  • Den cirkumflex ( ^) matchar början av raden.
  • Den dollartecken ( $) matchar slutet av raden.
  • Den asterisk ( *) matchar noll eller flera förekomster av föregående tecken.
  • Den plus ( +) matchar en eller flera förekomst (er) av det föregående tecknet.
  • Den frågetecken ( ?) matchar noll eller en förekomst av det föregående tecknet.
  • Den prick ( .) matchar exakt ett tecken.

Komplexa sedkonstruktioner är möjliga, så att de kan fungera som ett enkelt men mycket specialiserat programmeringsspråk . Kontrollflödet kan till exempel hanteras med hjälp av en etikett (ett kolon följt av en sträng) och greninstruktionen b. En instruktion bföljt av ett giltigt etikettnamn flyttar bearbetningen till blocket som följer den etiketten.

sed används som filter

Under Unix används sed ofta som ett filter i en pipeline :

generateData | sed 's/x/y/g'

Det vill säga, ett program som "genereraData" genererar data, och sedan gör sed den lilla ändringen att ersätta x med y . Till exempel:

$ echo xyz xyz | sed 's/x/y/g'
yyz yyz

Filbaserade sed-skript

Det är ofta användbart att lägga in flera sed -kommandon, ett kommando per rad, i en skriptfil, t.ex. subst.sed, och sedan använda -falternativet för att köra kommandona (t.ex. s/x/y/g) från filen:

sed -f subst.sed inputFileName > outputFileName

Vilket antal kommandon som helst kan placeras i skriptfilen, och om du använder en skriptfil undviker du också problem med att komma ut eller byta ut.

En sådan skriptfil kan göras direkt körbar från kommandoraden genom att förbereda den med en " shebang -rad " som innehåller sed -kommandot och tilldela den körbara behörigheten till filen. Till exempel kan en fil subst.sedskapas med innehåll:

#!/bin/sed -f
s/x/y/g

Filen kan sedan göras körbar av den nuvarande användaren med chmodkommandot:

chmod u+x subst.sed

Filen kan sedan köras direkt från kommandoraden:

subst.sed inputFileName > outputFileName

Redigering på plats

Det -ialternativ infördes i GNU sed tillåter på plats redigering av filer (i själva verket är en temporär utdatafil skapas i bakgrunden, och sedan den ursprungliga filen skall ersättas med temporär fil). Till exempel:

sed -i 's/abc/def/' fileName

Exempel

Hej världen! exempel

# convert input text stream to "Hello, world!"
s/.*/Hello, world!/
q

Denna "Hej, värld!" skriptet finns i en fil (t.ex. script.txt) och anropas med sed -f script.txt inputFileName, där "inputFileName" är inmatningstextfilen. Skriptet ändrar "inputFileName" rad #1 till "Hej, värld!" och slutar sedan och skriver ut resultatet innan sed avslutas. Eventuella inmatningsrader förbi rad #1 läses inte och skrivs inte ut. Så den enda utgången är "Hej, värld!".

Exemplet betonar många viktiga egenskaper hos sed:

  • Typiska program är ganska korta och enkla.
  • sed -skript kan ha kommentarer (raden börjar med #symbolen).
  • Den s(substitut) kommandot är den viktigaste sed kommandot.
  • sed tillåter enkel programmering, med kommandon som q(avsluta).
  • sed använder regelbundna uttryck, till exempel .*(noll eller fler av alla tecken).

Andra enkla exempel

Nedan följer olika sed -skript; dessa kan köras genom att skicka som ett argument till sed, eller lägga i en separat fil och köras via -feller genom att göra själva skriptet körbart.

För att ersätta en förekomst av ett visst ord i en fil med "REDACTED", till exempel ett IRC -lösenord, och spara resultatet:

sed -i s/yourpassword/REDACTED/ ./status.chat.log

För att radera en rad som innehåller ordet "ditt ord" ( adressen är '/ditt ord/'):

/yourword/ d

För att radera alla förekomster av ordet "ditt ord":

s/yourword//g

Så här tar du bort två ord från en fil samtidigt:

s/firstword//g
s/secondword//g

För att uttrycka det föregående exemplet på en rad, till exempel när man går in på kommandoraden, kan man ansluta två kommandon via semikolon:

sed "s/firstword//g; s/secondword//g" inputFileName

Exempel på flera rader

I nästa exempel tar sed, som vanligtvis bara fungerar på en rad, bort nya rader från meningar där den andra raden börjar med ett mellanslag. Tänk på följande text:

This is my dog,
 whose name is Frank.
This is my fish,
whose name is George.
This is my goat,
 whose name is Adam.

Sed -skriptet nedan gör texten ovan till följande text. Observera att skriptet endast påverkar inmatningsraderna som börjar med ett mellanslag:

This is my dog, whose name is Frank.
This is my fish,
whose name is George.
This is my goat, whose name is Adam.

Manuset är:

N
s/\n / /
P
D

Detta förklaras som:

  • ( N) lägg till nästa rad i mönsterutrymmet;
  • ( s/\n / /) hitta en ny rad följt av ett mellanslag, ersätt med ett mellanslag;
  • ( P) skriv ut den övre raden i mönsterutrymmet;
  • ( D) ta bort den översta raden från mönsterutrymmet och kör skriptet igen.

Detta kan uttryckas på en enda rad via semikolon:

sed 'N; s/\n / /; P; D' inputFileName

Begränsningar och alternativ

Även om det är enkelt och begränsat, är sed tillräckligt kraftfullt för ett stort antal ändamål. För mer sofistikerad bearbetning används istället kraftfullare språk som AWK eller Perl . Dessa används särskilt om en linje omvandlas på ett sätt som är mer komplicerat än en regex -extrahering och mallbyte, även om godtyckligt komplicerade transformationer i princip är möjliga med hjälp av lagringsbufferten.

Omvänt, för enklare operationer, specialiserade Unix -verktyg som grep (utskriftslinjer som matchar ett mönster), huvud (skriv ut den första delen av en fil), svans (skriv ut den sista delen av en fil) och tr (översätt eller radera tecken) är ofta att föredra. För de specifika uppgifter de är utformade för att utföra, är sådana specialiserade verktyg vanligtvis enklare, tydligare och snabbare än en mer allmän lösning som sed.

Ed/sed -kommandon och syntax fortsätter att användas i efterkommande program, till exempel textredigerarna vi och vim . En analog till ed /sed är sam /ssam, där sam är Plan 9 -redigeraren, och ssam är ett strömgränssnitt till det, vilket ger funktionalitet som liknar sed.

Se även

Anteckningar

Referenser

Vidare läsning

externa länkar

Handledningar

Exempel

Andra länkar