sed - sed
Paradigm | skript |
---|---|
Designad av | Lee E. McMahon |
Första gången dök upp | 1974 |
Implementeringsspråk | C |
Hemsida | www |
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 d
att radera mönsterutrymmet, q
sluta, N
lä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 ( -e
alternativ) eller läsas från en separat fil ( -f
alternativ). 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 2d
körs bara d
(delete) -kommandot på den andra inmatningsraden (skriver ut alla rader utom den andra), medan /^ /d
alla 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 -e
att indikera att ett uttryck följer. Den s
står för ersättning, medan g
stå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 regexp
ger både mönstermatchning och spara text via under uttryck, medan replacement
kan vara antingen bokstav text eller en formatsträng som innehåller tecknen &
för "hela matchen" eller speciella escape-sekvenser \1
genom \9
fö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 \1
i 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 b
fö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 -f
alternativet 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.sed
skapas med innehåll:
#!/bin/sed -f
s/x/y/g
Filen kan sedan göras körbar av den nuvarande användaren med chmod
kommandot:
chmod u+x subst.sed
Filen kan sedan köras direkt från kommandoraden:
subst.sed inputFileName > outputFileName
Redigering på plats
Det -i
alternativ 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 -f
eller 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
- Bell Labs åttonde upplaga (ca 1985) Unix sed (1) manuell sida
- GNU sed -dokumentation eller manualsidan
- Dale Dougherty & Arnold Robbins (mars 1997). sed & awk (2: a uppl.). O'Reilly . ISBN 1-56592-225-5.
- Arnold Robbins (juni 2002). sed and awk Pocket Reference (2: a uppl.). O'Reilly . ISBN 0-596-00352-8.
- Peter Patsis (december 1998). UNIX AWK och SED Programmer's Interactive Workbook (UNIX Interactive Workbook) . Prentice Hall . ISBN 0-13-082675-8.
- Daniel Goldman (februari 2013). Definitiv guide till sed . EHDP Press. ISBN 978-1-939824-00-4.
- Sourceforge.net , sed sed FAQ (mars 2003)
externa länkar
- den enda UNIX -specifikationen , nummer 7 från The Open Group - Referens för kommandon och verktyg,
- Plan 9 programmerarhandbok, volym 1 -
Handledningar
- Sed - An Introduction and Tutorial , av Bruce Barnett
- SED-En icke-interaktiv textredigerare (1974) , av Lee E. McMahon
- 31+ exempel på Sed Linux Command In Text Manipulation , av Mokhtar Ebrahim
Exempel
- Viktiga källor för sed -skript, filer, användning
- Roger Changs SED och Shell Scripts (2012)
- Top 'sed' kommandon - Användningsexempel
- Sed kommando exempel i Unix & Linux
Andra länkar
- GNU sed hemsida (inkluderar GNU sed manual)
- sed the Stream Editor (2004) (Eric Pement)
- sed-användare Yahoo diskussionsgrupp