logo

Sed Command i Linux/Unix med eksempler

Linux 'sed' kommando står for stream editor. Den brukes til å redigere strømmer (filer) ved hjelp av regulære uttrykk. Men denne redigeringen er ikke permanent. Det forblir bare på skjermen, men i faktisk forblir filinnholdet det samme.

Primært brukes den til teksterstatning; i tillegg kan den brukes til andre tekstmanipulasjonsoperasjoner som å sette inn, slette, søke og mer. Sed-kommandoen lar oss redigere filer uten å åpne dem. Støtte for regulære uttrykk gjør det til et kraftigere tekstmanipuleringsverktøy.

Oversikt over sed-kommando

Det er et Unix-verktøy som transformerer og analyserer tekst med et kompakt og enkelt programmeringsspråk. Det ble integrert fra 1973 til 1974 av Lee E. McMahon fra Bell Labs og er til stede i dag for nesten alle operativsystemer. Sed-kommandoen var basert på skriptaspektene til den tidligere qed (hurtigredigering) og den interaktive ed-editoren. Det var det tidligste verktøyet for å støtte regulære uttrykk, og forblir aktivt for tekstbehandling, viktigst av alt med substitusjonskommandoen. Kjente alternative verktøy inkluderer Perl og AWK for 'strømredigering' og manipulering av ren tekststreng.

Driftsmodus for sed-kommando

Sed-kommandoen er et tekstbehandlingslinjeorientert verktøy: den leser linje for linje tekst fra en fil eller inndatastrøm inn i en intern buffer kjent som mønsterrommet. Alle linjeavlesninger begynner en syklus. Kommandoen sed bruker en eller flere operasjoner som er beskrevet av et sed-skript til mønsterrommet. Den opererer et programmeringsspråk ved å bruke omtrent 25 kommandoer som beskriver operasjonene over teksten.

For alle inndatalinjer resulterer sed-kommandoen vanligvis i mønsterrommet og starter syklusen med neste linje igjen etter å ha utført skriptet. Andre end-of-script-naturer er tilgjengelige fra skriptkommandoer og set-alternativer, for eksempel N for umiddelbart å inkludere neste linje i mønsterrommet, q for å avslutte, d for å fjerne mønsterrommet, og så videre. Derfor relaterer et sed-skript til en loop-kropp som itererer fra en strømlinje, der loop-variabelen og selve loopen opprettholdes og implisitt av sed.

  • Et sed-skript kan enten beskrives på kommandolinjen eller leses gjennom en isolert fil. I sed-skriptet kan kommandoer ta en ekstra adresse i sammenheng med regulære uttrykk eller linjenummer. Adressen bestemmer når kommandoen utføres. For eksempel vil 2d bare utføre kommandoen d (eller delete) på den andre inngangslinjen, mens /^ /d vil fjerne hver linje som begynner med et mellomrom.
  • Hold-plassen, en isolert spesiell buffer, kan brukes av noen sed-kommandoer for å holde en akkumulerende tekst mellom sykluser. Kommandospråket til sed har kun to variabler (mønstermellomrom og holdrom) og GOTO-lignende forgreningsfunksjonalitet. Språket er imidlertid Turing-komplett. Esoteriske sed-skript er tilgjengelige for flere spill som tetris, sjakk, arkanoid og sokoban.
  • Hovedsløyfen kjører for alle linjene i inngangsstrømmen, og sjekker sed-skriptet på alle linjene i inngangen. Sed-skriptlinjene er alle et mønster-handling-par, som representerer hvilket mønster for matching og hvilken handling som skal implementeres, som kan kopieres som en betinget setning. Standardhandlingene (skriv ut mønsterplass, kopier linjen til mønsterområdet), inn- og utdatastrømmer og arbeidsvariabler (hold mellomrom og mønsterrom) er implisitte; det er mulig å spesifisere kortfattede one-liner-programmer på grunn av hovedsløyfen.

Bruk av sed Command

    Byttekommando
    Eksemplet nedenfor representerer den mest kommandoen og typiske bruken av sed-kommandoen, dvs. substitusjon. Bruken var den faktiske motivasjonen for sed-kommandoen:
    sed 's/regexp/replacement/g' inputFileName > outputFileNameAndre kommandoer av sed
    Andre måter er også mulig for enkel behandling med rundt 25 sed-kommandoer. Nedenfor bruker for eksempel d-alternativet for å filtrere ut linjer som bare inkluderer mellomrom og linjetegnslutt:
    sed '/^ *$/d' inputFileName
    Eksemplet ovenfor bruker noen av metategnene nedenfor for regulære uttrykk:
    • Karetten (^) er den samme som starten på linjen.
    • Dollarsymbolet ($) er det samme som fullføringen av linjen.
    • Stjernen (*) er den samme som den forrige tegnforekomsten med mer eller null.
    • Plusssymbolet (+) er det samme som en eller flere foregående tegnforekomster.
    • Spørsmålstegnet (?) er det samme som forrige tegnforekomst mer eller null.
    • Punktsymbolet (.) er nøyaktig det samme som ett tegn.
    sed som et filter
    Ofte brukes sed-kommandoen som filteret inne i en rørledning under Unix:
    $generateData | sed 's/x/y/g'
    GenererData-programmet genererer data, og sed-kommandoen gjør en liten endring ved å erstatte x i stedet for y.Filbaserte sed-skript
    Ofte er det nyttig å sette mange sed-kommandoer, en enkelt kommando per hver linje, i en skriptfil og bruke -f-flagget for å utføre kommandoene fra filen:
    sed -f subst.sed inputFileName > outputFileName

Syntaks:

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

Alternativer:

Følgende er noen kommandolinjealternativer for sed-kommandoen:

-n, --stille, --stille: Det tillater oss kraftig å skrive ut mønsterrom.

-e script, --expression=script: Den brukes til å legge til skriptet til kommandoene som skal utføres.

-f script-fil, --file=script-fil: Den brukes til å legge til innholdet i skriptfilen til kommandoene som skal utføres.

--følg-symbolkoblinger: den brukes til å følge symbolkoblinger når behandlingen er på plass.

-i[SUFFIX], --in-place[=SUFFIX]: den brukes til å redigere filer på plass (oppretter sikkerhetskopi hvis SUFFIX-alternativet er inkludert).

-l N, --line-length=N: Den brukes til å spesifisere ønsket linjeomslutningslengde for `l'-kommandoen.

--posix: den brukes til å deaktivere alle GNU-utvidelser.

-E, -r, --regexp-extended: Det lar oss bruke de utvidede regulære uttrykkene i skriptet (for portabilitet bruk POSIX -E).

-s, --separat: den brukes til å betrakte filer som separate snarere enn som en enkelt og fortsetter den lange strømmen.

--Sandkasse: Den brukes til å operere i sandkassemodus.

-u, --ubuffret: Den brukes til å laste inn minimale datamengder fra inngangsfilene og tømmer utgangsbufferne oftere.

-z, --null-data: Den brukes til å skille linjer med NUL-tegn.

--hjelp: den brukes til å vise hjelpemanualen.

--versjon: Den brukes til å vise versjonsinformasjon.

Eksempler på sed Command

La oss se følgende eksempler:

Søker på STDIN-katalogen

Sed-kommandoen er ikke bare begrenset til å manipulere filer; også, vi kan bruke den til STDIN-katalogen.

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

Kommandoene ovenfor vil erstatte den første teksten med det andre tekstmønsteret. Tenk på utgangen nedenfor:

Linux Sed-filter

Fra utgangen ovenfor har vi først utført 'sed'-kommandoen på en streng 'class7' der 'class' endres til 'jtp' og 7 til 10. Deretter har vi utført 'sed'-kommandoen på en stream 'msg.txt ' der 'lære' er konvertert til 'studer'.

Global erstatning

I det tidligere eksemplet ble ikke alle 'lære'-ord redigert til 'studer'. For å redigere hvert ord må vi bruke en global erstatning 'g'. Den vil redigere alle de angitte ordene i en fil eller streng.

Syntaks:

 command | sed 's///g' 

Tenk på eksemplene nedenfor:

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

Kommandoene ovenfor vil erstatte alt det angitte tekstmønsteret. Tenk på utgangen nedenfor:

Linux Sed-filter

Fra utgangen ovenfor, ved å utføre kommandoen 'echo class7 class9 | sed 's/class/jtp/g'' all 'class' konverteres til 'jtp' og med kommandoen 'cat msg.txt | sed 's/learn/study/g'' all 'learn' ble konvertert til 'study'.

Fjerne en linje

'd'-alternativet lar oss fjerne en hel linje fra en fil. Vi trenger bare å spesifisere et ord fra den linjen med 'd'-alternativet, og den linjen vil bli slettet. Men merk at alle linjene som har det samme ordet vil bli slettet. Det vil bli utført som:

 cat | sed '//d' 

Tenk på kommandoen nedenfor:

fjerner siste commit git
 cat msg.txt | sed '/jtp/d' 

Kommandoen ovenfor vil slette linjene som har ordet 'jtp'. Tenk på utgangen nedenfor:

Linux Sed-filter

Fra utgangen ovenfor, ved å utføre kommandoen 'cat msg.txt | sed '/jtp/d'' er alle linjer som inneholder ordet 'jtp' slettet.

Bruke Multiple sed-kommandoen

Alternativet '-e' lar oss utføre flere sed-kommandoer samtidig. Vi kan utføre mer enn én sed-operasjon ved å utføre kommandoen som:

 sed -e ' ; ' 

Tenk på kommandoen nedenfor:

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

Kommandoen ovenfor vil bruke alle de spesifiserte operasjonene i filen 'exm.txt'. Tenk på utgangen nedenfor:

Linux Sed-filter

Som vi kan se fra utgangen ovenfor, erstattes alle de 'røde' ordene med 'blå', og alle de 'gule' ordene erstattes med 'svart'. Vi kan også skille kommandoer som dette:

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

Resultatet vil være det samme som kommandoen ovenfor.

Lese kommandoer fra en fil

Vi kan lagre sed-kommandoene i en fil og bruke dem samtidig i en hvilken som helst fil. Det kan gjøres ved å spesifisere '-f'-alternativet som følger:

 sed -f 

Fra kommandoen ovenfor er '' en fil som har en sed-kommandoliste. Tenk på kommandoen nedenfor:

 sed -f SedCommands exm.txt 

Kommandoen ovenfor vil bruke alle de spesifiserte kommandoene i 'SedCommand'-filen på 'exm.txt'. Tenk på utgangen nedenfor:

Linux Sed-filter

Fra utgangen ovenfor har vi brukt kommandoer brukt på det tidligere eksemplet. Så utgangen er den samme som i forrige eksempel.

Bytter ut tegn

Vi kan bruke utropstegnet (!) som strengavgrensning. For eksempel ønsker vi å erstatte bash-skall og erstatte det med csh-skall i '/etc/passwd'. For å gjøre det, kjør kommandoen nedenfor:

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

Vi kan oppnå samme resultat ved å utføre kommandoen nedenfor:

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

Begrense sed

Den grunnleggende bruken av sed-kommandoen behandler hele filen. Men vi kan begrense sed-kommandoen og spesifisere hvilken som helst linje. Det er to måter å begrense sed-kommandoen på:

  • En rekke linjer.
  • Et mønster som matcher en bestemt linje.

Vi kan gi et nummer for å spesifisere en linje som følger:

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

Kommandoen ovenfor vil bruke den angitte operasjonen på den tredje linjen. Tenk på utgangen nedenfor:

Linux Sed-filter

Fra utgangen ovenfor er bare linje tre endret.

Vi kan også spesifisere en rekke linjer. For å spesifisere en rekke linjer, utfør kommandoen som følger:

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

Kommandoen ovenfor vil oppdatere den angitte teksten i linje 1 og 3. Vurder utdataene nedenfor:

Linux Sed-filter

Sette inn og legge til tekst

'i' og 'a'-flagget brukes til å sette inn og legge til teksten på en fil. 'i'-flagget vil legge til teksten før strengen, og 'a'-flagget brukes til å legge til tekst etter strengen. Tenk på kommandoen nedenfor:

 echo 'Another Demo' | sed 'iFirst Demo' 

Kommandoen ovenfor vil sette inn teksten før teksten 'Another Demo'. Tenk på utgangen nedenfor:

Linux Sed-filter

For å legge til tekst, kjør kommandoen som følger:

 echo 'Another Demo' | sed 'aFirst Demo' 

Kommandoen ovenfor vil legge til teksten. Tenk på utgangen nedenfor:

Linux Sed-filter

Endre linjer

'c'-flagget brukes til å endre en spesifikk linje. For å endre en linje, kjør kommandoen som følger:

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

Kommandoen ovenfor vil oppdatere linje tre. Tenk på utgangen nedenfor:

Linux Sed-filter

Vi kan også bruke et regulært uttrykk for å oppdatere mer enn én linje med samme mønster. Tenk på kommandoen nedenfor:

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

Kommandoen ovenfor vil oppdatere alle linjene som har strengen 'Apple is'. Tenk på utgangen nedenfor:

Linux Sed-filter

Transformasjon av karakterer

'y'-flagget brukes til å transformere karakterene. Transformasjonen av tegn kan ikke begrenses til spesifikke forekomster. For å transformere tegn, kjør kommandoen som følger:

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

Kommandoen ovenfor vil transformere tegnene 'a', 'b', 'c' til 'd', 'e', ​​'f'. vurder utgangen nedenfor:

Linux Sed-filter

Skrive ut linjenumrene

'='-tegnet brukes til å skrive ut linjenummeret. For å skrive ut linjenummeret, utfør kommandoen som følger:

 sed '=' exm.txt 

Kommandoen ovenfor viser linjenummeret til filinnholdet. Tenk på utgangen nedenfor:

Linux Sed-filter

Likhetstegnet med alternativet '-n' spesifiserer linjenummeret som inneholder et samsvarende skript. Tenk på utgangen nedenfor:

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

Kommandoen ovenfor vil vise linjenummeret som inneholder ordet 'mango'. Tenk på utgangen nedenfor:

Linux Sed-filter

Fra utgangen ovenfor kan vi se linje nummer 2 har ordet 'mango'.