Sed

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 16 augusti 2021; kontroller kräver 4 redigeringar .

sed
Sorts datorprogram , UNIX [d] verktyg , textredigerare och skriptspråk
Utvecklaren Lee McMahon [d] [1]
Operativ system Unix-liknande operativsystem
Första upplagan 1974
senaste versionen 4.8 ( 15 januari 2020 )
Hemsida gnu.org/software/sed/

sed (från engelska.  S tream ED itor ) är en strömmande textredigerare (liksom ett programmeringsspråk ) som tillämpar olika fördefinierade texttransformationer på en seriell ström av textdata.

Det skrevs ursprungligen som ett UNIX - verktyg av Lee  E. McMahon från Bell Labs 1973-74 . sed är nu tillgängligt för praktiskt taget alla operativsystem som stöder kommandoradsarbete .

Sed är ett Turing-komplett språk eftersom det kan användas för att skapa en Turing-maskin [2] [3] .

Beskrivning

sed tar en indataström (vanligtvis en fil) rad för rad, redigerar varje rad enligt reglerna definierade i sed- skriptet med vanligt sed- språk och skriver sedan ut resultatet till utdataströmmen.

sed kallas ofta för en icke-interaktiv textredigerare. Den skiljer sig från vanliga textredigerare genom sin "inversion" i förhållande till texten och uppsättningen redigeringskommandon. Vanliga textredigerare laddar först in hela texten i dokumentet och tillämpar sedan kommandon på den ett i taget, medan sed först laddar in en uppsättning kommandon i sig själv och sedan tillämpar hela uppsättningen kommandon på varje textrad. Eftersom endast en rad finns i minnet åt gången, kan sed bearbeta godtyckligt stora textfiler.

Sed- kommandouppsättningen är modellerad efter ed- editorn , men var medveten om dess inversion. Till exempel betyder eds 25d-kommando " gå till rad 25 och ta bort den ", medan samma sed -kommando betyder " om det är radnummer 25, ta bort (skriv inte ut) den ". Ett anmärkningsvärt undantag är kommandona kopiera och flytta, som sträcker sig över ett antal rader och därför inte har några direkta sed- ekvivalenter . Istället introducerar sed en extra buffert som kallas "capture space" och ytterligare kommandon för att manipulera det. Till exempel skulle kommandot " kopiera rad 25 till rad 76 " ( 25t76 ) i ed kodas som två separata kommandon ( 25h; 76g ) ​​i sed för att lagra raden i fångstutrymmet tills data hämtas.

Följande exempel visar en typisk användning av sed :

sed -e 's/oldstuff/newstuff/g' inputFileName > outputFileName

Här är  en ersättare; g  är global, vilket betyder " alla förekomster av det sökta värdet ". Efter det första snedstrecket framåt finns det ett reguljärt uttryck att söka efter, efter det andra ett ersättningsuttryck. Men förutom snedstrecket kan ett annat tecken användas. Så till exempel uttrycken

echo 123123 | sed 's/1/5/g' echo 123123 | sed 's%1%5%g' echo 123123 | sed 's$1$5$g' echo 123123 | sed 's|1|5|g'

är helt likvärdiga.

Kommandot ersätt (s///) är det mest kraftfulla och vanligaste sed- kommandot . Stdout-omdirigeringen " > outputFileName" kan utelämnas, i vilket fall sed kommer att skriva ut resultatet på skärmen.

Unix används kommandot sed ofta som ett filter i en pipeline (| eller pipe):

generera_data | sed -e 's/x/y/'

På detta sätt genereras data och skickas till pipelinen för att ersätta x med y .

Flera kommandon kan kombineras i en fil (till exempel subst.sed) och sedan tillämpas som:

sed -f subst.sed inputFileName > outputFileName

Eller så kan du skriva en skriptfil med en shebang . Till exempel genom att skapa en körbar fil subst.sedmed innehållet:

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

Det kan göras direkt:

subst.sed inputFileName > outputFileName

Förutom utbyte är andra former av enkel bearbetning möjliga. Till exempel tar följande skript bort tomma rader eller rader som bara innehåller mellanslag:

sed -e '/^\s*$/d' inputFileName

Det sista exemplet använde metateckendelen av de reguljära uttrycken:

  • ^ Matchar början av en rad
  • $ Matchar slutet av strängen
  • . Matchar vilket enskilt tecken som helst
  • * Matchar noll eller fler förekomster av föregående tecken
  • [ ] Matcha något av tecknen inom hakparenteser mellan [ och ]
  • [^ ] Matcha något av tecknen som inte ingår i hakparenteserna mellan [^ och ]
  • \ bokstav matchar varje enskilt tecken från en viss teckenklass, i synnerhet \s är vilket blankstegstecken som helst.

Komplexa konstruktioner av sed är möjliga i den mån att det kan ses som ett mycket specialiserat, om än enkelt, programmeringsspråk . Kontrollflödet kan till exempel styras med en etikett (ett kolon följt av en sträng som ska vara namnet på etiketten) och en b -greninstruktion ; en b- sats följt av ett giltigt etikettnamn kommer att flytta bearbetningen till blocket efter etiketten; om etiketten inte finns kommer grenen att avsluta skriptet ( script ).

sed  är ett av de tidigaste Unix-kommandona som gjorde att du kunde bearbeta datafiler från kommandoraden. sed har utvecklats som en naturlig efterföljare till det populära grep-kommandot . I likhet med det senare programmeringsspråket AWK tillät sed kraftfull och intressant datamanipulation i skalskript och var ett av de första Unix-verktygen som faktiskt uppmuntrade korrekt användning av reguljära uttryck.

När det gäller exekveringshastighet är sed märkbart snabbare än AWK.

sed och awk anses ofta vara stamfader och inspirationer till Perl-språket , och i synnerhet syntaxen " " s///från exemplet ovan.

Sed - språket har inga variabler, bara GOTO primitiva och förgrenande funktionalitet; det är dock ett Turing-komplett språk.

GNU sed har flera nya funktioner, såsom filersättningsredigering (ersätter originalfilen med utdata från sed ). Redigering på plats används ofta istället för ed -skriptet , till exempel

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

kan användas istället

ed fil 1 ,$ s/abc/def/ w q

Det finns en utökad version av sed som heter Super-sed ( ssed ), som inkluderar Perl-kompatibla reguljära uttryck .

Matchningstabell för specialtecken

Genom att använda HEX-16 kan du infoga specialtecken

Karaktär i ASCII Överensstämmelse i HEX-16
" \x22
' \x27
, \x2C
$ \x24
! \x21
; \x3B
` \x60
| \x7C

Användningsexempel:

Obligatoriskt: ersätt "hej" med "hej värld"

sed 's/\x22hello\x22\x2C/\x22hello world\x22\x2C/g'

Vissa tecken i HEX-16 fortsätter att behandlas som reguljära uttryck och kräver escape.

Exempel:

Krävs: replace $config['default_host'] = ''; to $config['default_host'] = ' lokalvärd ';

sed -i 's/\x24config\[\x27default_host\x27\] = \x27\x27\x3B/\x24config\[\x27default_host\x27\] = \x27localhost\x27\x3B/g' /etc/roundcube/config .inc.php

Se även

  • grep  - sök efter text med reguljära uttryck.

Anteckningar

  1. http://sed.sourceforge.net/grabbag/tutorials/sed_mcmahon.txt
  2. Implementering av en Turing-maskin som Sed-skript . Hämtad 11 februari 2005. Arkiverad från originalet 20 februari 2018.
  3. Turing.sed . Hämtad 11 februari 2005. Arkiverad från originalet 16 januari 2018.

Länkar