logo

Sed Commando in Linux/Unix met voorbeelden

Linux 'sed'-opdracht staat voor stream-editor. Het wordt gebruikt om streams (bestanden) te bewerken met behulp van reguliere expressies. Maar deze bewerking is niet permanent. Het blijft alleen in de weergave, maar in werkelijkheid blijft de bestandsinhoud hetzelfde.

In de eerste plaats wordt het gebruikt voor tekstvervanging; bovendien kan het worden gebruikt voor andere tekstmanipulatiebewerkingen zoals invoegen, verwijderen, zoeken en meer. Met de opdracht sed kunnen we bestanden bewerken zonder ze te openen. Ondersteuning voor reguliere expressies maakt het een krachtiger hulpmiddel voor tekstmanipulatie.

Overzicht van sed-commando

Het is een Unix-hulpprogramma dat tekst transformeert en parseert met een compacte en eenvoudige programmeertaal. Het werd van 1973 tot 1974 geïntegreerd door Lee E. McMahon van Bell Labs en is tegenwoordig voor bijna elk besturingssysteem aanwezig. Het sed-commando was gebaseerd op de scriptaspecten van de eerdere qed (snelle editor) en de interactieve ed-editor. Het was het eerste hulpmiddel voor het ondersteunen van reguliere expressies en blijft actief voor tekstverwerking, vooral met het substitutiecommando. Bekende alternatieve tools zijn onder meer Perl en AWK 'streambewerking' en manipulatie van tekenreeksen in platte tekst.

Bedieningsmodus van sed Commando

De opdracht sed is een regelgericht hulpprogramma voor tekstverwerking: het leest regel voor regel tekst uit een bestand of invoerstroom in een interne buffer die bekend staat als de patroonruimte. Alle regellezingen beginnen een cyclus. Het sed-commando gebruikt een of meerdere bewerkingen die door een sed-script in de patroonruimte zijn beschreven. Het gebruikt een programmeertaal die ongeveer 25 commando's gebruikt die de bewerkingen op de tekst beschrijven.

Voor alle invoerregels resulteert het sed-commando normaal gesproken in de patroonruimte en begint de cyclus opnieuw met de volgende regel na het uitvoeren van het script. Andere end-of-script-aarden zijn beschikbaar via scriptopdrachten en set-opties, bijvoorbeeld N om onmiddellijk de volgende regel in de patroonruimte op te nemen, q om te stoppen, d om de patroonruimte te verwijderen, enzovoort. Een sed-script heeft dus betrekking op een luslichaam dat itereert vanuit een stroomlijn, waarin de lusvariabele en de lus zelf door sed worden onderhouden en impliciet.

  • Een sed-script kan op de opdrachtregel worden beschreven of via een geïsoleerd bestand worden gelezen. In het sed-script kunnen opdrachten een extra adres aannemen in de context van reguliere expressies of regelnummers. Het adres bepaalt wanneer de opdracht wordt uitgevoerd. 2d zal bijvoorbeeld alleen de opdracht d (of delete) uitvoeren op de tweede invoerregel, terwijl /^ /d elke regel verwijdert die begint met een spatie.
  • De vasthoudruimte, een geïsoleerde speciale buffer, kan door sommige sed-opdrachten worden gebruikt voor het vasthouden van een verzamelde tekst tussen cycli. De commandotaal van sed heeft slechts twee variabelen (patroonruimte en vasthoudruimte) en GOTO-achtige vertakkingsfunctionaliteit. De taal is echter Turing-compleet. Esoterische sed-scripts zijn beschikbaar voor verschillende spellen zoals tetris, schaken, arkanoid en sokoban.
  • De hoofdlus loopt voor alle regels van de invoerstroom en controleert het sed-script op alle regels van de invoer. De sed-scriptregels zijn allemaal een patroon-actie-paar, dat aangeeft welk patroon moet worden gematcht en welke actie moet worden geïmplementeerd, wat kan worden gekopieerd als een voorwaardelijke instructie. De standaardacties (patroonruimte afdrukken, lijn naar de patroonruimte kopiëren), invoer- en uitvoerstromen en werkvariabelen (ruimte vasthouden en patroonruimte) zijn impliciet; het is mogelijk om korte onelinerprogramma's te specificeren vanwege de hoofdlus.

Gebruik van sed-commando

    Vervangingsopdracht
    Het onderstaande voorbeeld vertegenwoordigt het meest commando en typische gebruik van het sed-commando, dat wil zeggen vervanging. Het gebruik was de feitelijke motivatie voor het sed-commando:
    sed 's/regexp/replacement/g' inputFileName > outputFileNameAndere commando's van sed
    Er zijn ook andere manieren mogelijk voor een eenvoudige verwerking met zo'n 25 sed-commando's. Hieronder wordt bijvoorbeeld de d-optie gebruikt voor het filteren van regels die alleen spaties en het einde van het regelteken bevatten:
    sed '/^ *$/d' inputBestandsnaam
    In het bovenstaande voorbeeld worden enkele van de onderstaande metatekens voor reguliere expressies gebruikt:
    • Het dakje (^) is hetzelfde als het begin van de regel.
    • Het dollarteken ($) is hetzelfde als de voltooiing van de regel.
    • Het sterretje (*) is hetzelfde als het vorige teken dat meer of nul voorkomt.
    • Het plusteken (+) is hetzelfde als de één of meerdere voorgaande tekens.
    • Het vraagteken (?) is hetzelfde als het aantal voorgaande tekens dat eerder of eerder voorkomt.
    • Het puntsymbool (.) is precies hetzelfde als één teken.
    als filter
    Vaak wordt het sed-commando gebruikt als filter in een pijplijn onder Unix:
    $generateData | sed 's/x/y/g'
    Het generatorData-programma genereert gegevens, en het sed-commando brengt een kleine verandering aan door x te vervangen in plaats van y.Op bestanden gebaseerde sed-scripts
    Vaak is het handig om veel sed-opdrachten, één opdracht per regel, in een scriptbestand te plaatsen en de vlag -f te gebruiken om de opdrachten uit het bestand uit te voeren:
    sed -f subst.sed inputFileName > outputFileName

Syntaxis:

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

Opties:

Hieronder volgen enkele opdrachtregelopties van de opdracht sed:

-n, --stil, --stil: Het stelt ons krachtig in staat patroonruimte af te drukken.

-e-script, --expression=script: Het wordt gebruikt om het script toe te voegen aan de uit te voeren opdrachten.

-f scriptbestand, --file=scriptbestand: Het wordt gebruikt om de inhoud van een scriptbestand toe te voegen aan de uit te voeren opdrachten.

--volg-symlinks: het wordt gebruikt om symlinks te volgen tijdens de verwerking.

-i[SUFFIX], --in-place[=SUFFIX]: het wordt gebruikt om bestanden ter plaatse te bewerken (maakt een back-up als de SUFFIX-optie is geleverd).

-l N, --lijnlengte=N: Het wordt gebruikt om de gewenste regelomlooplengte voor het `l'-commando op te geven.

--posix: het wordt gebruikt om alle GNU-extensies uit te schakelen.

-E, -r, --regexp-uitgebreid: Het stelt ons in staat om de uitgebreide reguliere expressies in het script te gebruiken (voor portabiliteit gebruik POSIX -E).

converteer tekenreeks naar json java

-s, --afzonderlijk: het wordt gebruikt om bestanden als afzonderlijk te beschouwen in plaats van als één geheel en zet de lange stroom voort.

--zandbak: Het wordt gebruikt om in de sandbox-modus te werken.

-u, --niet-gebufferd: Het wordt gebruikt om de minimale hoeveelheden gegevens uit de invoerbestanden te laden en de uitvoerbuffers vaker leeg te maken.

-z, --null-gegevens: Het wordt gebruikt om regels te scheiden door NUL-tekens.

--hulp: het wordt gebruikt om de helphandleiding weer te geven.

--versie: Het wordt gebruikt om versie-informatie weer te geven.

Voorbeelden van sed Commando

Laten we de volgende voorbeelden bekijken:

Toepassen op de STDIN-directory

Het sed-commando is niet alleen beperkt tot het manipuleren van bestanden; we kunnen het ook toepassen op de STDIN-directory.

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

De bovenstaande opdrachten vervangen de eerste tekst door het tweede tekstpatroon. Beschouw de onderstaande uitvoer:

Linux Sed-filter

Uit de bovenstaande uitvoer hebben we eerst het 'sed'-commando uitgevoerd op een string 'class7' waarbij 'class' is veranderd in 'jtp' en 7 in 10. Vervolgens hebben we het 'sed'-commando uitgevoerd op een stream 'msg.txt ' waarbij 'leren' wordt omgezet in 'studie'.

Mondiale vervanging

In het eerdere voorbeeld werden niet alle 'leer'-woorden omgezet in 'studie'. Om elk woord te bewerken, moeten we een globale vervanging 'g' gebruiken. Het zal alle gespecificeerde woorden in een bestand of string bewerken.

Syntaxis:

 command | sed 's///g' 

Beschouw de onderstaande voorbeelden:

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

De bovenstaande opdrachten vervangen het gehele opgegeven tekstpatroon. Beschouw de onderstaande uitvoer:

Linux Sed-filter

Uit de bovenstaande uitvoer, door het commando 'echo class7 class9 | sed 's/class/jtp/g'' alle 'klasse' wordt omgezet in 'jtp' en met het commando 'cat msg.txt | sed 's/learn/study/g'' al het 'learn' werd omgezet in 'study'.

Een lijn verwijderen

Met de 'd'-optie kunnen we een volledige regel uit een bestand verwijderen. We hoeven alleen maar een woord uit die regel op te geven met de optie 'd', en die regel wordt verwijderd. Maar houd er rekening mee dat alle regels met hetzelfde woord worden verwijderd. Het wordt uitgevoerd als:

 cat | sed '//d' 

Overweeg het onderstaande commando:

 cat msg.txt | sed '/jtp/d' 

Met het bovenstaande commando worden de regels verwijderd die het woord 'jtp' bevatten. Beschouw de onderstaande uitvoer:

Linux Sed-filter

Uit de bovenstaande uitvoer, door het commando 'cat msg.txt | sed '/jtp/d'' alle regels die het woord 'jtp' bevatten, worden verwijderd.

Het commando Meerdere sed gebruiken

Met de optie '-e' kunnen we meerdere sed-opdrachten tegelijk uitvoeren. We kunnen meer dan één sed-bewerking uitvoeren door de opdracht uit te voeren als:

 sed -e ' ; ' 

Overweeg het onderstaande commando:

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

Met het bovenstaande commando worden alle opgegeven bewerkingen in het bestand 'exm.txt' toegepast. Beschouw de onderstaande uitvoer:

Linux Sed-filter

Zoals we uit de bovenstaande uitvoer kunnen zien, zijn alle 'rode' woorden vervangen door 'blauw' en alle 'gele' woorden door 'zwart'. We kunnen ook commando's als volgt scheiden:

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

Het resultaat zal hetzelfde zijn als het bovenstaande commando.

Commando's uit een bestand lezen

We kunnen de sed-opdrachten in een bestand opslaan en ze in elk bestand in één keer toepassen. U kunt dit doen door de optie '-f' als volgt op te geven:

 sed -f 

Van de bovenstaande opdracht is '' een bestand met een sed-opdrachtenlijst. Overweeg het onderstaande commando:

redden van
 sed -f SedCommands exm.txt 

Met het bovenstaande commando worden alle opgegeven commando's in het 'SedCommand'-bestand op 'exm.txt' toegepast. Beschouw de onderstaande uitvoer:

Linux Sed-filter

Uit de bovenstaande uitvoer hebben we opdrachten gebruikt die op het eerdere voorbeeld zijn toegepast. De uitvoer is dus hetzelfde als in het vorige voorbeeld.

Karakters vervangen

We kunnen het uitroepteken (!) gebruiken als tekenreeksscheidingsteken. We willen bijvoorbeeld de bash-shell vervangen en deze vervangen door csh-shell in '/etc/passwd'. Om dit te doen, voert u de onderstaande opdracht uit:

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

We kunnen hetzelfde resultaat bereiken door de onderstaande opdracht uit te voeren:

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

Het beperken van de sed

Het basisgebruik van de opdracht sed verwerkt het hele bestand. Maar we kunnen de opdracht sed beperken en elke regel specificeren. Er zijn twee manieren om de opdracht sed te beperken:

  • Een reeks lijnen.
  • Een patroon dat overeenkomt met een specifieke lijn.

We kunnen als volgt een nummer opgeven om een ​​regel te specificeren:

verschil tussen liefde en like
 sed '3s/Red/Blue/' exm.txt 

Met het bovenstaande commando wordt de opgegeven bewerking op de derde regel toegepast. Beschouw de onderstaande uitvoer:

Linux Sed-filter

Uit de bovenstaande uitvoer wordt alleen regel drie gewijzigd.

We kunnen ook een reeks lijnen specificeren. Om een ​​reeks regels op te geven, voert u de opdracht als volgt uit:

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

Met het bovenstaande commando wordt de opgegeven tekst in regel 1 en 3 bijgewerkt. Bekijk de onderstaande uitvoer:

Linux Sed-filter

Tekst invoegen en toevoegen

De vlag 'i' en 'a' worden gebruikt om de tekst in een bestand in te voegen en toe te voegen. De vlag 'i' voegt de tekst vóór de string toe, en de vlag 'a' wordt gebruikt om tekst na de string toe te voegen. Overweeg het onderstaande commando:

 echo 'Another Demo' | sed 'iFirst Demo' 

Met het bovenstaande commando wordt de tekst ingevoegd vóór de tekst 'Nog een demo'. Beschouw de onderstaande uitvoer:

Linux Sed-filter

Om tekst toe te voegen, voert u de opdracht als volgt uit:

 echo 'Another Demo' | sed 'aFirst Demo' 

Met het bovenstaande commando wordt de tekst toegevoegd. Beschouw de onderstaande uitvoer:

Linux Sed-filter

Lijnen wijzigen

De 'c'-vlag wordt gebruikt om een ​​specifieke regel te wijzigen. Om een ​​regel te wijzigen, voert u de opdracht als volgt uit:

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

Met het bovenstaande commando wordt regel drie bijgewerkt. Beschouw de onderstaande uitvoer:

Linux Sed-filter

We kunnen ook een reguliere expressie gebruiken om meer dan één regel met hetzelfde patroon bij te werken. Overweeg het onderstaande commando:

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

Met het bovenstaande commando worden alle regels bijgewerkt met de tekenreeks 'Apple is'. Beschouw de onderstaande uitvoer:

Linux Sed-filter

Transformatie van karakters

De 'y'-vlag wordt gebruikt om de karakters te transformeren. De transformatie van karakters kan niet beperkt blijven tot specifieke gebeurtenissen. Om karakters te transformeren, voert u de opdracht als volgt uit:

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

Met het bovenstaande commando worden de tekens 'a', 'b', 'c' omgezet in 'd', 'e', ​​'f'. overweeg de onderstaande uitvoer:

Linux Sed-filter

De regelnummers afdrukken

Het '='-teken wordt gebruikt om het regelnummer af te drukken. Om het regelnummer af te drukken, voert u de opdracht als volgt uit:

 sed '=' exm.txt 

Met de bovenstaande opdracht wordt het regelnummer van de bestandsinhoud weergegeven. Beschouw de onderstaande uitvoer:

Linux Sed-filter

Het gelijkteken met de optie '-n' geeft het regelnummer aan dat een overeenkomend script bevat. Beschouw de onderstaande uitvoer:

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

De bovenstaande opdracht geeft het regelnummer weer dat het woord 'mango' bevat. Beschouw de onderstaande uitvoer:

Linux Sed-filter

Uit de bovenstaande uitvoer kunnen we zien dat regel nummer 2 het woord 'mango' bevat.