logo

Sed Command i Linux/Unix med eksempler

Linux 'sed' kommando står for stream editor. Det bruges til at redigere streams (filer) ved hjælp af regulære udtryk. Men denne redigering er ikke permanent. Det forbliver kun på skærmen, men i virkeligheden forbliver filindholdet det samme.

Primært bruges det til tekstsubstitution; derudover kan den bruges til andre tekstmanipulationsoperationer som indsættelse, sletning, søgning og mere. Kommandoen sed giver os mulighed for at redigere filer uden at åbne dem. Understøttelse af regulære udtryk gør det til et mere kraftfuldt tekstmanipulationsværktøj.

Oversigt over sed-kommando

Det er et Unix-værktøj, der transformerer og analyserer tekst med et kompakt og enkelt programmeringssprog. Det blev integreret fra 1973 til 1974 af Lee E. McMahon fra Bell Labs og er til stede i dag for næsten alle operativsystemer. Sed-kommandoen var baseret på scripting-aspekterne fra den tidligere qed (hurtig editor) og den interaktive ed-editor. Det var det tidligste værktøj til at understøtte regulære udtryk og forbliver aktivt til tekstbehandling, vigtigst af alt med substitutionskommandoen. Berømte alternative værktøjer omfatter Perl og AWK til 'stream redigering' og manipulation af almindelig tekststreng.

Driftstilstand for sed-kommando

Sed-kommandoen er et tekstbehandlingslinjeorienteret værktøj: den læser linje for linje tekst fra en fil eller inputstrøm ind i en intern buffer kendt som mønsterrummet. Alle linjelæsninger begynder en cyklus. Kommandoen sed bruger en eller flere operationer, som er blevet beskrevet af et sed-script til mønsterrummet. Den driver et programmeringssprog ved hjælp af omkring 25 kommandoer, der beskriver handlingerne over teksten.

For alle inputlinjer resulterer sed-kommandoen normalt i mønsterrummet og starter cyklussen med den næste linje igen efter at have udført scriptet. Andre end-of-script-naturer er tilgængelige fra script-kommandoer og indstillingsmuligheder, f.eks. N for straks at inkludere den næste linje i mønsterrummet, q for at afslutte, d for at fjerne mønsterrummet, og så videre. Derfor relaterer et sed-script til en loop-body, der itererer fra en strømlinje, hvor loop-variablen og selve loopet vedligeholdes og implicit af sed.

  • Et sed-script kan enten beskrives på kommandolinjen eller læses gennem en isoleret fil. I sed-scriptet kan kommandoer tage en ekstra adresse i forbindelse med regulære udtryk eller linjenumre. Adressen bestemmer, hvornår kommandoen udføres. For eksempel vil 2d kun udføre kommandoen d (eller delete) på den 2. inputlinje, mens /^ /d vil fjerne hver linje, der starter med et mellemrum.
  • Holdrummet, en isoleret speciel buffer, kan bruges af nogle sed-kommandoer til at holde en akkumulerende tekst mellem cyklusser. Kommandosproget for sed har kun to variabler (mønstermellemrum og holdrum) og GOTO-lignende forgreningsfunktionalitet. Sproget er dog Turing-komplet. Esoteriske sed-scripts er tilgængelige til flere spil som tetris, skak, arkanoid og sokoban.
  • Hovedsløjfen kører for alle linjer i inputstrømmen og tjekker sed-scriptet på alle linjer i input. Sed-scriptlinjerne er alle et mønster-handling-par, der repræsenterer hvilket mønster der skal matches og hvilken handling der skal implementeres, som kan kopieres som en betinget erklæring. Standardhandlingerne (udskriv mønsterrum, kopi linje til mønsterrummet), input- og outputstrømme og arbejdsvariabler (hold mellemrum og mønsterrum) er implicitte; det er muligt at specificere kortfattede one-liner programmer på grund af hovedsløjfen.

Brug af sed Command

    Udskiftningskommando
    Nedenstående eksempel repræsenterer den mest kommando og typiske brug af sed-kommandoen, dvs. substitution. Brugen var den egentlige motivation for sed-kommandoen:
    sed 's/regexp/replacement/g' inputFileName > outputFileNameAndre kommandoer af sed
    Andre måder er også mulige for enkel behandling med omkring 25 sed-kommandoer. Nedenstående bruger f.eks. d-indstillingen til at bortfiltrere linjer, der kun indeholder mellemrum og slutningen af ​​linjetegn:
    sed '/^ *$/d' inputFileName
    Ovenstående eksempel bruger et par af nedenstående regulære udtryks metakarakterer:
    • Karetten (^) er den samme som starten på linjen.
    • Dollarsymbolet ($) er det samme som færdiggørelsen af ​​linjen.
    • Stjernen (*) er den samme som den foregående tegnforekomst mere eller nul.
    • Plus-symbolet (+) er det samme som et eller flere foregående tegn.
    • Spørgsmålstegnet (?) er det samme som den tidligere tegnforekomst mere eller nul.
    • Priksymbolet (.) er nøjagtigt det samme som ét tegn.
    sed som et filter
    Ofte bruges sed-kommandoen som filteret inde i en pipeline under Unix:
    $generateData | sed 's/x/y/g'
    GenererData-programmet genererer data, og sed-kommandoen foretager en lille ændring ved at erstatte x i stedet for y.Fil-baserede sed-scripts
    Ofte er det nyttigt at placere mange sed-kommandoer, en enkelt kommando pr. hver linje, i en scriptfil og bruge flaget -f til at udføre kommandoerne fra filen:
    sed -f subst.sed inputFileName > outputFileName

Syntaks:

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

Muligheder:

Følgende er nogle kommandolinjeindstillinger for sed-kommandoen:

-n, --stille, --stille: Det giver os kraftigt mulighed for at udskrive mønsterrum.

-e script, --expression=script: Det bruges til at tilføje scriptet til de kommandoer, der skal udføres.

-f script-fil, --file=script-fil: Det bruges til at tilføje indholdet af script-fil til de kommandoer, der skal udføres.

--følg-symlinks: det bruges til at følge symbollinks, når der behandles på plads.

-i[SUFFIX], --in-place[=SUFFIX]: det bruges til at redigere filer på plads (opretter backup, hvis SUFFIX-indstillingen er leveret).

-l N, --line-længde=N: Den bruges til at angive den ønskede linjeomslutningslængde for kommandoen `l'.

--posix: den bruges til at deaktivere alle GNU-udvidelser.

-E, -r, --regexp-extended: Det giver os mulighed for at bruge de udvidede regulære udtryk i scriptet (til portabilitet brug POSIX -E).

-s, --adskil: det bruges til at betragte filer som separate snarere end som en enkelt og fortsætter den lange strøm.

--sandkasse: Den bruges til at fungere i sandkassetilstand.

-u, --unbuffered: Det bruges til at indlæse de minimale mængder data fra inputfilerne og tømmer outputbufferne oftere.

-z, --null-data: Det bruges til at adskille linjer med NUL-tegn.

--Hjælp: den bruges til at vise hjælpemanualen.

--version: Det bruges til at vise versionsoplysninger.

Eksempler på sed Command

Lad os se følgende eksempler:

Ansøger til STDIN-biblioteket

Kommandoen sed er ikke kun begrænset til at manipulere filer; Vi kan også anvende det på STDIN-biblioteket.

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

Ovenstående kommandoer erstatter den første tekst med det andet tekstmønster. Overvej nedenstående output:

Linux Sed-filter

Fra ovenstående output har vi først udført 'sed' kommando på en streng 'class7' hvor 'class' ændres til 'jtp' og 7 til 10. Derefter har vi udført 'sed' kommando på en stream 'msg.txt ' hvor 'lær' er konverteret til 'studie'.

Global erstatning

I det tidligere eksempel blev alle 'lære'-ord ikke redigeret til 'study'. For at redigere hvert ord skal vi bruge en global erstatning 'g'. Det vil redigere alle de angivne ord i en fil eller streng.

Syntaks:

 command | sed 's///g' 

Overvej nedenstående eksempler:

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

Ovenstående kommandoer erstatter alt det angivne tekstmønster. Overvej nedenstående output:

Linux Sed-filter

Fra ovenstående output, ved at udføre kommandoen 'echo class7 class9 | sed 's/class/jtp/g'' hele 'klassen' konverteres til 'jtp' og med kommandoen 'cat msg.txt | sed 's/learn/study/g'' alt 'learn' blev konverteret til 'study'.

Fjernelse af en linje

'd'-indstillingen vil lade os fjerne en komplet linje fra en fil. Vi behøver kun at angive et ord fra den linje med 'd' mulighed, og den linje vil blive slettet. Men bemærk, at alle linjer med det samme ord vil blive slettet. Det vil blive udført som:

 cat | sed '//d' 

Overvej nedenstående kommando:

Madhuri sagde kom nu
 cat msg.txt | sed '/jtp/d' 

Ovenstående kommando vil slette linjerne med ordet 'jtp'. Overvej nedenstående output:

Linux Sed-filter

Fra ovenstående output, ved at udføre kommandoen 'cat msg.txt | sed '/jtp/d'' slettes alle linjer, der indeholder ordet 'jtp'.

Brug af Multiple sed-kommandoen

Muligheden '-e' giver os mulighed for at udføre de flere sed-kommandoer på én gang. Vi kan udføre mere end én sed-operation ved at udføre kommandoen som:

 sed -e ' ; ' 

Overvej nedenstående kommando:

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

Ovenstående kommando vil anvende alle de specificerede operationer i filen 'exm.txt'. Overvej nedenstående output:

Linux Sed-filter

Som vi kan se fra ovenstående output, er alle de 'røde' ord erstattet med 'blå', og alle de 'gule' ord er erstattet med 'sort'. Vi kan også adskille kommandoer som dette:

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

Resultatet vil være det samme som ovenstående kommando.

Læsning af kommandoer fra en fil

Vi kan gemme sed-kommandoerne i en fil og anvende dem på én gang i enhver fil. Det kan gøres ved at angive '-f'-indstillingen som følger:

 sed -f 

Fra ovenstående kommando er '' en fil, der har en sed-kommandoliste. Overvej nedenstående kommando:

 sed -f SedCommands exm.txt 

Ovenstående kommando vil anvende alle de specificerede kommandoer i 'SedCommand'-filen på 'exm.txt'. Overvej nedenstående output:

Linux Sed-filter

Fra ovenstående output har vi brugt kommandoer anvendt på det tidligere eksempel. Så outputtet er det samme som det foregående eksempel.

Udskiftning af tegn

Vi kan bruge udråbstegn (!) som strengeafgrænsning. For eksempel ønsker vi at erstatte bash shell og erstatte den med csh shell i '/etc/passwd'. For at gøre det skal du udføre kommandoen nedenfor:

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

Vi kan opnå det samme resultat ved at udføre nedenstående kommando:

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

Begrænsning af sed

Den grundlæggende brug af sed-kommandoen behandler hele filen. Men vi kan begrænse sed-kommandoen og angive enhver linje. Der er to måder at begrænse sed-kommandoen på:

  • En række linjer.
  • Et mønster, der matcher en bestemt linje.

Vi kan angive et nummer for at angive en linje som følger:

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

Ovenstående kommando vil anvende den angivne operation på den tredje linje. Overvej nedenstående output:

Linux Sed-filter

Fra ovenstående output er det kun linje tre, der ændres.

Vi kan også angive en række linjer. For at angive en række linjer skal du udføre kommandoen som følger:

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

Ovenstående kommando vil opdatere den angivne tekst i linje 1 og 3. Overvej nedenstående output:

Linux Sed-filter

Indsættelse og tilføjelse af tekst

Flaget 'i' og 'a' bruges til at indsætte og tilføje teksten på en fil. 'i'-flaget tilføjer teksten før strengen, og 'a'-flaget bruges til at tilføje tekst efter strengen. Overvej nedenstående kommando:

 echo 'Another Demo' | sed 'iFirst Demo' 

Ovenstående kommando vil indsætte teksten før teksten 'En anden demo'. Overvej nedenstående output:

Linux Sed-filter

For at tilføje tekst skal du udføre kommandoen som følger:

 echo 'Another Demo' | sed 'aFirst Demo' 

Ovenstående kommando vil tilføje teksten. Overvej nedenstående output:

Linux Sed-filter

Ændring af linjer

'c'-flaget bruges til at ændre en specifik linje. For at ændre en linje skal du udføre kommandoen som følger:

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

Ovenstående kommando vil opdatere linje tre. Overvej nedenstående output:

Linux Sed-filter

Vi kan også bruge et regulært udtryk til at opdatere mere end én linje med det samme mønster. Overvej nedenstående kommando:

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

Ovenstående kommando vil opdatere alle linjer med strengen 'Apple er'. Overvej nedenstående output:

Linux Sed-filter

Transformation af karakterer

'y'-flaget bruges til at transformere tegnene. Transformationen af ​​tegn kan ikke begrænses til specifikke forekomster. For at transformere tegn skal du udføre kommandoen som følger:

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

Ovenstående kommando vil transformere tegnene 'a', 'b', 'c' til 'd', 'e', ​​'f'. overvej nedenstående output:

Linux Sed-filter

Udskrivning af linjenumre

Tegnet '=' bruges til at udskrive linjenummeret. For at udskrive linjenummeret skal du udføre kommandoen som følger:

 sed '=' exm.txt 

Ovenstående kommando viser linjenummeret for filindholdet. Overvej nedenstående output:

Linux Sed-filter

Lighedstegnet med '-n'-indstillingen angiver det linjenummer, der indeholder et matchende script. Overvej nedenstående output:

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

Ovenstående kommando vil vise linjenummeret, der indeholder ordet 'mango'. Overvej nedenstående output:

Linux Sed-filter

Fra ovenstående output kan vi se linje nummer 2 har ordet 'mango'.