Hoe Sed in Linux te gebruiken
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 sed
en 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 n
subcommand. 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 andere basisfunctie van sed is de p
subcommand. Vergelijkbaar met n
leest 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 p
subopdracht 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 p
aanwezig is of niet:
Om dit vreemde gedrag uit te schakelen, voegt u de -n
vlag toe voordat u uw sed-subopdrachten uitvoert:
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 p
subopdracht.
De volgende opdracht gebruikt de bereiksyntaxis van sed om de derde tot en met vijfde regel in uw bestand “hello.txt” af te drukken:
U kunt de p
subopdracht 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”:
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 d
subopdracht samen met de specifieke regel of het bereik dat u wilt verwijderen:
Vergelijkbaar met het afdrukken van tekstregels, d
werkt de subopdracht met bereiken van meerdere regels. De volgende opdracht verwijdert bijvoorbeeld de eerste vier regels uit het bestand “hello.txt”:
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:
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 a
opdracht gevolgd door de tekst die u wilt toevoegen:
Het is ook mogelijk om hele bestanden in een sed-tekststroom op te nemen. Gebruik hiervoor de r
opdracht gevolgd door de naam van het bestand dat u wilt toevoegen:
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:
Vervang de p
subopdracht door s
en 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 g
optie toe na de derde backslash van uw expressie:
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 p
subopdracht 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 H
subopdracht 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:
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:
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:
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:
Naast output redirection kunt u ook de ingebouwde -i
flag 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:
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