In het vorige bericht hebben we het gehad over bash-functies en hoe je die direct vanaf de opdrachtregel kunt gebruiken, en we hebben nog wat andere coole dingen gezien. Vandaag gaan we het hebben over een handige tool voor het manipuleren van tekenreeksen, genaamd sed of sed Linux command.
We gebruiken sed om met tekstbestanden te werken, zoals logbestanden, configuratiebestanden en andere tekstbestanden.
In dit bericht gaan we ons richten op het sed Linux commando, dat wordt gebruikt voor het manipuleren van tekst, wat een essentiële stap is in onze bash scripting reis.
Linux-systeem biedt een aantal hulpmiddelen voor tekstverwerking; een van die hulpmiddelen is sed.
We zullen de 31+ voorbeelden bespreken met afbeeldingen om de uitvoer van elk voorbeeld te laten zien.
Tabel van de inhoud
Sed Linux-commando begrijpen
Het sed-commando is een niet-interactieve teksteditor. Sed Linux commando bewerkt gegevens op basis van de regels die je opgeeft; je kunt het als volgt gebruiken:
$ sed options file
Je bent niet beperkt tot het gebruik van sed om bestanden te manipuleren; je past het direct toe op de STDIN zoals dit:
$ echo "Welcome to LikeGeeks page" | sed 's/page/website/'
Het s commando vervangt de eerste tekst door het tweede tekstpatroon. In dit geval hebben we de string “website” vervangen door het woord “pagina”.
Het bovenstaande voorbeeld was een eenvoudig voorbeeld om de tool te demonstreren. We kunnen het Linux commando sed ook gebruiken om bestanden te manipuleren.
Laten we een voorbeeldbestand maken :
$ sed 's/test/another test/' ./myfile
De resultaten worden onmiddellijk op het scherm afgedrukt; u hoeft niet te wachten tot het bestand tot het einde is verwerkt.
Als uw bestand groot genoeg is, ziet u het resultaat al voordat de verwerking klaar is.
Sed Linux commando werkt uw gegevens niet bij. Het stuurt alleen de gewijzigde tekst naar STDOUT. Het bestand blijft onaangeroerd. Als je de bestaande inhoud moet overschrijven, kun je onze vorige post bekijken, die ging over redirections.
Meerdere sed Linux commando’s gebruiken op de commandoregel
Om meerdere sed commando’s uit te voeren, kunt u de -e optie als volgt gebruiken:
$ sed -e 's/This/That/; s/test/another test/' ./myfile
U moet de sed commando’s scheiden door een puntkomma zonder spaties.
Ook kunt u een enkel aanhalingsteken gebruiken om commando’s van elkaar te scheiden:
$ sed -e '> s/This/That/> s/test/another test/' myfile
Hetzelfde resultaat, geen probleem.
Commando’s uit een bestand lezen
Je kunt je sed commando’s in een bestand opslaan en gebruiken door het bestand op te geven met de -f optie.
$ cat mycommandss/This/That/s/test/another test/
$ sed -f mycommands myfile
Vlaggen substitueren
Kijk eens goed naar het volgende voorbeeld:
$ cat myfile
$ sed 's/test/another test/' myfile
Het bovenstaande resultaat laat zien dat we het eerste voorkomen in elke regel hebben vervangen. Om alle occurrences van een patroon te vervangen, gebruik je een van de volgende substitutievlaggen.
We kunnen de vlaggen als volgt schrijven:
s/pattern/replacement/flags
Er zijn vier soorten substituties:
- g, vervangt alle occurrences.
- Een getal, het occurrence-nummer voor de nieuwe tekst die je wilt vervangen.
- p, drukt de oorspronkelijke inhoud af.
- w bestand: betekent schrijf de resultaten naar een bestand.
U kunt de vervanging beperken door het occurrence-nummer op te geven dat als volgt moet worden vervangen:
$ sed 's/test/another test/2' myfile
Zoals u kunt zien, hebben we alleen het tweede occurrence op elke regel vervangen.
De vlag g betekent globaal, wat een globale vervanging betekent voor alle voorkomens:
$ sed 's/test/another test/g' myfile
De vlag p drukt elke regel af die een patroonovereenkomst bevat, u kunt de optie -n gebruiken om alleen de gewijzigde regels af te drukken.
$ cat myfile
$ sed -n 's/test/another test/p' myfile
De vlag w slaat de uitvoer op in een opgegeven bestand:
$ sed 's/test/another test/w output' myfile
We hebben de uitvoer op het scherm afgedrukt, maar we hebben de overeenkomende regels in het uitvoerbestand opgeslagen.
Tekens vervangen
Voorstel dat u wilt zoeken naar bash shell en deze wilt vervangen door csh shell in het /etc/passwd bestand met behulp van sed, wel, u kunt het gemakkelijk doen:
$ sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd
Oh!! dat ziet er verschrikkelijk uit.
Gelukkig is er nog een andere manier om dat te bereiken. Je kunt het uitroepteken (!) als string scheidingsteken gebruiken zoals dit:
$ sed 's!/bin/bash!/bin/csh!' /etc/passwd
Nu is het makkelijker te lezen.
Sed commando beperken
Sed commando verwerkt je hele bestand. U kunt het sed commando echter beperken om specifieke regels te verwerken; er zijn twee manieren:
- Een reeks regels.
- Een patroon dat overeenkomt met een specifieke regel.
U kunt een getal typen om het tot een specifieke regel te beperken:
$ sed '2s/test/another test/' myfile
We hebben alleen regel twee gewijzigd.
Wat dacht je van het gebruik van een reeks regels:
$ sed '2,3s/test/another test/' myfile
Ook kunnen we beginnen bij een regel aan het einde van het bestand:
$ sed '2,$s/test/another test/' myfile
Of u kunt een patroon als dit gebruiken:
$ sed '/likegeeks/s/bash/csh/' /etc/passwd
Geweldig!!
U kunt reguliere expressies gebruiken om dit patroon generieker en bruikbaarder te maken.
Regels verwijderen
Om regels te verwijderen met sed, kunt u de delete (d) vlag gebruiken is uw vriend.
De vlag delete verwijdert de tekst uit de stream, niet het oorspronkelijke bestand.
$ sed '2d' myfile
Hier verwijderen we alleen de tweede regel uit myfile.
Hoe zit het met het verwijderen van een reeks regels?
$ sed '2,3d' myfile
Hier verwijderen we een reeks regels, de tweede en de derde.
Een ander type bereik:
$ sed '3,$d' myfile
Hier verwijderen we vanaf de derde regel tot het einde van het bestand.
Al deze voorbeelden wijzigen nooit het oorspronkelijke bestand.
$ sed '/test 1/d' myfile
Hier gebruiken we een patroon om de regel te verwijderen als deze op de eerste regel overeenkomt.
Als u een reeks regels wilt verwijderen, kunt u twee tekstpatronen als volgt gebruiken:
$ sed '/second/,/fourth/d' myfile
Wij hebben van de tweede tot en met de vierde regel verwijderd.
Tekst invoegen en toevoegen
U kunt tekstregels invoegen of toevoegen met behulp van de volgende vlaggen:
- De (i)-vlag.
- De (a)-vlag.
$ echo "Another test" | sed 'i\First test '
We hebben de tekst vóór de opgegeven regel ingevoegd.
$ echo "Another test" | sed 'a\First test '
We hebben de tekst na de opgegeven regel toegevoegd.
Wat dacht u van tekst in het midden toevoegen?
Eenvoudig, kijk naar het volgende voorbeeld:
$ sed '2i\This is the inserted line.' myfile
En het append werkt op dezelfde manier, maar kijk naar de positie van de geapplende tekst:
$ sed '2a\This is the appended line.' myfile
We hebben dezelfde vlaggen gebruikt, maar met een locatie van invoegen of appen.
Regels wijzigen
Om een specifieke regel te wijzigen, kunt u de vlag (c) als volgt gebruiken:
$ sed '3c\This is a modified line.' myfile
U kunt een regelmatig expressiepatroon gebruiken, en alle regels die met dat patroon overeenkomen, worden gewijzigd.
$ sed '/This is/c Line updated.' myfile
Transformeer tekens
De transformeervlag (y) werkt op tekens als deze:
$ sed 'y/123/567/' myfile
We hebben de transformatie op alle gegevens toegepast, en we kunnen deze niet beperken tot een specifieke occurrence.
Regelnummers afdrukken
U kunt het regelnummer afdrukken met het (=)-teken, zoals hieronder:
$ sed '=' myfile
Maar door -n te gebruiken in combinatie met het gelijkheidsteken, geeft het sed-commando het regelnummer weer dat overeenkomende tekens bevat.
$ sed -n '/test/=' myfile
Leest gegevens uit een bestand
U kunt de vlag (r) gebruiken om gegevens uit een bestand te lezen.
U kunt een regelnummer of een tekstpatroon definiëren voor de tekst die u wilt lezen.
$ cat newfile
$ sed '3r newfile' myfile
We hebben de inhoud zoals verwacht na de derde regel ingevoegd.
En dit is met behulp van een tekstpatroon:
$ sed '/test/r newfile' myfile
Cool toch?
Nuttige voorbeelden
Voorstel dat we een bestand hebben dat tekst bevat met een plaatshouder, en we hebben een ander bestand dat de gegevens bevat waarmee de plaatshouder in het andere bestand wordt gevuld.
We gebruiken de (r) en (d) vlaggen om de klus te klaren.
Het woord DATA in dat bestand is een plaatshouder voor een echte inhoud die we zullen opslaan in een ander bestand met de naam data.
We zullen het vervangen door de echte inhoud:
$ Sed '/DATA>/ {r newfiled}' myfile
Geweldig!!! zoals je kunt zien, hebben we de placeholder locatie gevuld met de data uit het andere bestand.
Dit is slechts een kleine introductie over het sed commando. Het sed Linux commando is een andere wereld op zich.
De enige beperking is je verbeelding.
Ik hoop dat je het makkelijk vindt om strings te manipuleren met het sed Linux commando.
Dank u.
Oprichter van LikeGeeks. Ik werk sinds 2010 als Linux-systeembeheerder. Ik ben verantwoordelijk voor het onderhouden, beveiligen en oplossen van problemen met Linux-servers voor meerdere klanten over de hele wereld. Ik schrijf graag shell- en Python-scripts om mijn werk te automatiseren.