Sed

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 16. august 2021; checks kræver 4 redigeringer .

sed
Type computerprogram , UNIX [d] værktøj , teksteditor og scriptsprog
Udvikler Lee McMahon [d] [1]
Operativ system Unix-lignende operativsystem
Første udgave 1974
nyeste version 4.8 ( 15. januar 2020 )
Internet side gnu.org/software/sed/

sed (fra engelsk.  S tream ED itor ) er en streaming teksteditor (såvel som et programmeringssprog ), der anvender forskellige foruddefinerede teksttransformationer til en seriel strøm af tekstdata.

Det blev oprindeligt skrevet som et UNIX -værktøj af Lee  E. McMahon fra Bell Labs i 1973-74 . sed er nu tilgængelig for stort set alle operativsystemer, der understøtter kommandolinjearbejde .

Sed er et Turing-komplet sprog, fordi det kan bruges til at skabe en Turing-maskine [2] [3] .

Beskrivelse

sed tager en inputstrøm (normalt en fil) linje for linje, redigerer hver linje i henhold til reglerne defineret i sed -scriptet ved at bruge almindeligt sed -sprog og udskriver derefter resultatet til outputstrømmen.

sed omtales ofte som en ikke-interaktiv teksteditor. Den adskiller sig fra almindelige teksteditorer ved sin "inversion" i forhold til teksten og sættet af redigeringskommandoer. Almindelige teksteditorer indlæser først hele teksten i dokumentet og anvender derefter kommandoer til det én ad gangen, mens sed først indlæser et sæt kommandoer i sig selv og derefter anvender hele sættet af kommandoer på hver tekstlinje. Da der kun er én linje i hukommelsen ad gangen, kan sed behandle vilkårligt store tekstfiler.

Sed- kommandosættet er modelleret efter ed- editoren , men vær opmærksom på dets inversion. For eksempel betyder eds 25d-kommando " gå til linje 25 og slet den ", mens den samme sed -kommando betyder " hvis det er linjenummer 25, så slet (udskriv ikke) det ". En bemærkelsesværdig undtagelse er kopierings- og flytkommandoerne, som spænder over en række linjer og derfor ikke har nogen direkte sed- ækvivalenter . I stedet introducerer sed en ekstra buffer kaldet "capture space" og yderligere kommandoer til at manipulere den. For eksempel vil kommandoen " kopier linje 25 til linje 76 " ( 25t76 ) i ed blive kodet som to separate kommandoer ( 25h; 76g ) ​​i sed for at gemme linjen i capture space, indtil dataene er hentet.

Følgende eksempel viser en typisk brug af sed :

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

Her er  en erstatning; g  er global, hvilket betyder " alle forekomster af den søgte værdi ". Efter den første fremadgående skråstreg er der et regulært udtryk at søge efter, efter det andet et erstatningsudtryk. Ud over skråstregen kan der dog bruges et andet tegn. Altså for eksempel udtrykkene

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

er fuldstændig ligeværdige.

Erstat-kommandoen (s///) er den mest kraftfulde og mest brugte sed- kommando . Stdout-omdirigeringen " > outputFileName" kan udelades, i hvilket tilfælde sed vil udskrive resultatet til skærmen.

Unix bruges sed- kommandoen ofte som et filter i en pipeline (| eller pipe):

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

På denne måde genereres data og sendes til pipelinen for at erstatte x med y .

Flere kommandoer kan kombineres i én fil (for eksempel subst.sed) og derefter anvendes som:

sed -f subst.sed inputFileName > outputFileName

Eller du kan skrive en script-fil ved hjælp af en shebang . For eksempel ved at oprette en eksekverbar fil subst.sedmed indholdet:

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

Det kan gøres direkte:

subst.sed inputFileName > outputFileName

Ud over udskiftning er andre former for enkel behandling mulig. For eksempel fjerner følgende script tomme linjer eller linjer, der kun indeholder mellemrum:

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

Det sidste eksempel brugte metakarakterdelen af ​​de regulære udtryk:

  • ^ Matcher begyndelsen af ​​en linje
  • $ Matcher slutningen af ​​strengen
  • . Matcher ethvert enkelt tegn
  • * Matcher nul eller flere forekomster af det foregående tegn
  • [ ] Match et hvilket som helst af tegnene omgivet af firkantede parenteser mellem [ og ]
  • [^ ] Match et hvilket som helst af tegnene, der ikke er inkluderet i firkantede parenteser mellem [^ og ]
  • \ bogstav matcher ethvert enkelt tegn fra en bestemt tegnklasse, især \s er ethvert mellemrumstegn.

Komplekse konstruktioner af sed er mulige i det omfang, det kan opfattes som et højt specialiseret, omend simpelt, programmeringssprog . Kontrolflowet kan for eksempel styres med en etiket (et kolon efterfulgt af en streng, der skal være navnet på etiketten) og en b -greninstruktion ; en b - sætning efterfulgt af et gyldigt etiketnavn vil flytte behandlingen til blokken efter etiketten; hvis etiketten ikke findes, vil grenen afslutte scriptet ( script ).

sed  er en af ​​de tidligste Unix-kommandoer, der tillod dig at behandle datafiler fra kommandolinjen. sed har udviklet sig som en naturlig efterfølger til den populære grep-kommando . I lighed med det senere AWK -programmeringssprog tillod sed kraftfuld og interessant datamanipulation i shell - scripts og var et af de første Unix-værktøjer, der rent faktisk opmuntrede til korrekt brug af regulære udtryk.

Med hensyn til udførelseshastighed er sed mærkbart hurtigere end AWK.

sed og awk betragtes ofte som stamfader og inspirationer til Perl-sproget , og især syntaksen " " s///fra eksemplet ovenfor.

Sed - sproget har ingen variabler, kun GOTO primitive og forgrenende funktionalitet; det er dog et Turing-komplet sprog.

GNU sed har flere nye funktioner, såsom filerstatningsredigering (erstatning af den originale fil med output fra sed ). In-place redigering bruges ofte i stedet for f.eks . ed -scriptet

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

kan bruges i stedet

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

Der er en udvidet version af sed kaldet Super-sed ( ssed ), som inkluderer Perl-kompatible regulære udtryk .

Matchende tabel for specialtegn

Ved at bruge HEX-16 kan du indsætte specialtegn

Karakter i ASCII Overholdelse i HEX-16
" \x22
' \x27
, \x2C
$ \x24
! \x21
; \x3B
` \x60
| \x7C

Eksempel på brug:

Påkrævet: Erstat "hello" med "hello world"

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

Nogle karakterer i HEX-16 bliver fortsat behandlet som regulære udtryk og kræver escape.

Eksempel:

Påkrævet: replace $config['default_host'] = ''; to $config['default_host'] = ' localhost ';

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

Se også

  • grep  - søg efter tekst ved hjælp af regulære udtryk.

Noter

  1. http://sed.sourceforge.net/grabbag/tutorials/sed_mcmahon.txt
  2. Implementering af en Turing-maskine som Sed-script . Hentet 11. februar 2005. Arkiveret fra originalen 20. februar 2018.
  3. Turing.sed . Hentet 11. februar 2005. Arkiveret fra originalen 16. januar 2018.

Links