Hoe Sed in Linux te gebruiken

Hoe Sed in Linux te gebruiken
Een foto van twee computerschermen waarop een grote hoeveelheid code te zien is.

Sed is een eenvoudig UNIX-programma dat geen bestanden maakt of bewerkt. Het wijzigt alleen de gegevens die via de invoer gaan en presenteert de gewijzigde gegevens op de uitvoer. Hier bekijken we een kort overzicht van de UNIX-filosofie, doorlopen we de basisprincipes van het gebruik seden laten we u voorbeelden zien van hoe u het programma kunt gebruiken voor dagelijkse taken.

De basisprincipes van het gebruik van Sed

Sed is een programma dat tekstdatastromen kan lezen en wijzigen. Dit betekent dat sed, in tegenstelling tot een gewone teksteditor, bestanden op uw computer niet rechtstreeks wijzigt. In plaats daarvan fungeert het meer als een “filter” voor binnenkomende data en stelt het u in staat deze op elke gewenste manier te transformeren.

Om te beginnen met sed, maak je eerst een bestand met minstens vijf regels tekst erin. Zorg ervoor dat er een “new line”-teken tussen je regels staat:

Het algemene commando voor sed is ongeveer:

Een van de meest basale functies in sed is de nsubcommand. Deze werkt door data te lezen van sed’s input en deze in de “pattern space” van uw programma te plaatsen. Dit is een speciale buffer die alle binnenkomende tekst vasthoudt voordat sed er enige manipulatie op uitvoert:

Een terminal die de inhoud van de

Een andere basisfunctie van sed is de psubcommand. Vergelijkbaar met nleest het de data die binnenkomt van sed’s input en plaatst het in de pattern space van het programma. Het print het echter ook expliciet op de output van uw terminal.

Het gebruik van de psubopdracht kan verwarrend zijn voor beginners, omdat het uitvoeren ervan met tekstinvoer resulteert in sed diens uitvoer twee keer print. Dit komt omdat sed standaard automatisch zijn patroonruimte print, ongeacht of deze paanwezig is of niet:

Een terminal die de uitvoer van de subopdracht p weergeeft zonder de -n vlag.

Om dit vreemde gedrag uit te schakelen, voegt u de -nvlag toe voordat u uw sed-subopdrachten uitvoert:

Een terminal met de uitvoer van de subopdracht p met de vlag -n ingeschakeld.

Nu we de basis hebben besproken, gaan we in de volgende paragrafen in op de verschillende manieren waarop u sed kunt gebruiken om tekstgegevens te manipuleren.

1. Tekststromen selecteren en bijsnijden

Naast het afdrukken kunt u sed ook gebruiken om tekst te selecteren en te trimmen uit zowel gegevensstromen als bestanden. De eenvoudigste manier om dit te doen is door een bereikwaarde toe te voegen aan de psubopdracht.

De volgende opdracht gebruikt de bereiksyntaxis van sed om de derde tot en met vijfde regel in uw bestand “hello.txt” af te drukken:

Een terminal die laat zien dat sed specifieke regelbereiken kan afdrukken.

U kunt de psubopdracht ook gebruiken om niet-aangrenzende regels in uw tekst af te drukken. Het volgende drukt bijvoorbeeld de eerste en vierde regel af in het bestand “hello.txt”:

Een terminal die sed toont, waarbij niet-aangrenzende regels uit een tekstbestand worden afgedrukt.

2. Tekst verwijderen uit een Sed-stream

Sed kan ook gegevens uit elke inkomende tekststroom verwijderen. Dit is handig als u een paar regels tekst uit een groot bestand wilt verwijderen of de uitvoer van een programma wilt opschonen om alleen de informatie weer te geven die u nodig hebt.

Om dit te doen, gebruikt u de dsubopdracht samen met de specifieke regel of het bereik dat u wilt verwijderen:

Een terminal die het proces laat zien voor het verwijderen van niet-aangrenzende regels met behulp van sed.

Vergelijkbaar met het afdrukken van tekstregels, dwerkt de subopdracht met bereiken van meerdere regels. De volgende opdracht verwijdert bijvoorbeeld de eerste vier regels uit het bestand “hello.txt”:

Een terminal die het proces laat zien voor het verwijderen van een reeks regels met behulp van sed.

Naast het matchen van specifieke regelbereiken, kunt u reguliere expressies gebruiken om de tekst te vinden die u wilt verwijderen. Als u dit doet, wordt sed verteld om te zoeken naar alle regels die het woord “world” bevatten en deze te verwijderen:

U kunt reguliere expressies ook behandelen als een bereik voor uw invoerbestand. Dit geeft u meer flexibiliteit bij het definiëren van uw selecties binnen het programma:

Een terminal die de mogelijkheid van sed toont om tekstregels te verwijderen op basis van een regex-patroon.

3. Nieuwe tekst toevoegen aan een Sed Streams

Naast het verwijderen van tekst, kan sed ook nieuwe tekst toevoegen aan bestaande datastromen. Hoewel het niet op het niveau van een volwaardige teksteditor is, kan deze functie nog steeds handig zijn voor eenmalige bewerkingen en basisteksttoevoegingen.

Om een ​​nieuwe tekstregel toe te voegen, voert u sed uit met de aopdracht gevolgd door de tekst die u wilt toevoegen:

Een terminal die het proces laat zien van het toevoegen van één regel tekst aan het einde van een sed-stream.

Het is ook mogelijk om hele bestanden in een sed-tekststroom op te nemen. Gebruik hiervoor de ropdracht gevolgd door de naam van het bestand dat u wilt toevoegen:

Een terminal die het proces laat zien van het toevoegen van een heel bestand aan het einde van een sed-stream.

4. Tekst in Sed zoeken en vervangen

Een van de krachtigste functies van sed is de mogelijkheid om tekst uit een tekststroom te vinden en te vervangen. In tegenstelling tot het toevoegen en verwijderen van tekst, kunt u hiermee dynamisch gegevens bewerken terwijl deze door UNIX-pipes gaan, waardoor het veel flexibeler is dan een gewone teksteditor.

Begin met het testen van uw tekstinvoer zonder enige wijzigingen vanuit sed:

Een terminal die de inhoud van de

Vervang de psubopdracht door sen voeg er drie backslashes (/) aan toe:

Voeg een structurele reguliere expressie van de tekenreeks die u wilt matchen in tussen de eerste en tweede backslash. Ik kan bijvoorbeeld de volgende waarde invoeren om te zoeken naar woorden die beginnen met “wo” in mijn invoerreeks:

Plaats uw tekstcursor tussen de tweede en derde backslash en geef vervolgens de tekst op waarmee u uw matches wilt vervangen. In tegenstelling tot de vorige kolom gebruikt deze sectie geen structurele reguliere expressies:

Standaard vervangt sed alleen de eerste string die het op een bepaalde regel matcht. Dit kan een probleem zijn als u elk exemplaar van een woord in uw tekststroom wilt vervangen. Om dit te verhelpen, voegt u de goptie toe na de derde backslash van uw expressie:

Een terminal met de substitutie-subopdracht in sed.

5. Tekstgegevens kopiëren naar de Hold-ruimte

Sed gebruikt twee buffers om tekstgegevens op te slaan: de patroonruimte en de hold-ruimte. De eerste dient als een tijdelijke plek voor uw tekst terwijl deze door sed-expressies gaat. De laatste fungeert als een klembord waar u willekeurige tekstgegevens kunt opslaan.

Een voordeel van deze aanpak is dat u bepaalde outputs kunt ‘vasthouden’ zonder afhankelijk te zijn van externe programma’s. Dit kan handig zijn als u van plan bent om sed te gebruiken om tekstmanipulaties met meerdere stappen te verwerken.

Om spaties te kunnen gebruiken, moet u er eerst voor zorgen dat u een bestand hebt met daarin minimaal een paar regels tekst:

Vervang de psubopdracht met h, en geef vervolgens een regelnummer of regex-waarde op die sed in uw bestand zal matchen. Als u dit doet, vertelt u sed om die specifieke tekstregel te nemen en deze te kopiëren naar zijn hold-ruimte:

U kunt ook de Hsubopdracht gebruiken om meerdere tekstregels in uw hold-ruimte op te slaan. De volgende opdracht slaat bijvoorbeeld de derde en vierde regel van mijn tekstbestand op en drukt deze af op de terminal:

Een terminal die het proces laat zien van het bewaren van meerdere tekstregels in sed's

6. Labels gebruiken om lussen te maken in Sed

Hoewel sed geen uitgebreide programmeertaal is, is het nog steeds mogelijk om loops in het programma te creëren. Dit is handig als u een sed-expressie nodig hebt die continu over een bepaald stuk tekstinvoer moet gaan.

Om een ​​lus in sed te maken, moet u eerst een label voor uw sed-expressie maken. Hiervoor moet u de :subopdracht gebruiken, gevolgd door het label dat u voor uw expressie wilt gebruiken.

Geef de matching criteria voor uw sed-expressie. In mijn geval wil ik dat het aan het einde van elke regel in mijn invoertekst komt:

Typ de sed-subcommando’s die u wilt uitvoeren wanneer sed een match vindt, en omsluit deze vervolgens met accolades. Het volgende voegt twee aangrenzende regels samen, vervangt het teken voor de nieuwe regel door een spatie en gaat vervolgens terug naar het begin van de expressie:

Een terminal die het proces laat zien van het verwijderen van nieuwe-regeltekens met behulp van sed-labels in lussen.

U kunt dit zelfs uitbreiden om bijna elk type invoertekst te matchen. Bijvoorbeeld, de volgende opdracht gebruikt sed’s uitgebreide regex-functie om HTML-tags uit uw invoertekst te verwijderen:

Een terminal die laat zien hoe sed de HTML-tags in een bestand verwijdert met behulp van lussen.

7. Permanente veranderingen aanbrengen in Sed

Net als met elke andere UNIX-tool kan sed profiteren van output redirection en pipes. Dit stelt u niet alleen in staat om sed aan andere programma’s te lijmen, maar het geeft u ook de mogelijkheid om uw wijzigingen permanent te maken.

De volgende regel code creëert een nieuw “welcome.txt”-bestand vanuit de uitvoer van mijn sed-opdracht:

Een terminal die laat zien hoe sed uitvoer kan omleiden om de uitvoer op te slaan in bestanden.

Naast output redirection kunt u ook de ingebouwde -iflag gebruiken om uw huidige bestand te bewerken in plaats van uw wijzigingen in uw terminalconsole uit te voeren. De volgende opdracht verwijdert bijvoorbeeld alle nieuwe regeltekens uit mijn tekstbestand en slaat het op:

Een terminal die de -i-vlag in sed toont, waarmee het programma kan

Als al dit gepraat u nieuwsgierig heeft gemaakt naar de Linux-opdrachtregel, kunt u ons eerdere artikel lezen waarin we het hebben over enkele van de meest interessante Bash-prompts die u vandaag kunt gebruiken.

Beeldmateriaal: Morgan Richardson via Unsplash . Alle wijzigingen en screenshots door Ramces Red.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *