Na grep is de volgende logische stap een tutorial over sed. Het sed-commando komt van Stream EDitor, en zoals de naam al aangeeft, gaat het over tekstflux. Als sed echter een van de krachtigste opdrachten in Unix is, is de handleidingpagina ook een van de meest raadselachtige. Ik zal in dit artikel proberen om het meest elementaire gebruik van sed samen te vatten en je een paar voorbeelden van geavanceerde scripts te geven.

Basics

Het algemene commando voor sed is zoiets als:

 sed [optie] '{script}' [tekstbestand] 

Sed voert de bewerkingen uit die u hem in het tekstbestand wilt laten uitvoeren en geeft het resultaat weer in de standaarduitvoer. Als u het resultaat in een tekstbestand wilt, kunt u het omleiden via de gebruikelijke methode:

 sed [optie] '{script}' [tekstbestand]> [bewerkt tekstbestand] 

Of gebruik de optie " -i " die het invoerbestand rechtstreeks zal bewerken:

 sed -i [optie] '{script}' [tekstbestand] 

Laten we nu aan het script gaan werken. De meest voor de hand liggende eerste stap is het nul script:

 sed '' test.txt 

zal gewoon de tekst weergeven in test.txt.

Een goed gebruik van sed is deletie. Laten we voorbeelden oefenen.

 sed '2, 4 d' test.txt 

zal de regels 2 tot 4 van test.txt verwijderen.

U kunt raden dat de syntaxis voor het script is:

 sed '[eerste regel om te verwijderen] [laatste regel om te verwijderen] d' test.txt 

Maar het mooie deel komt wanneer u reguliere expressies, of regex, als scheidingsteken voor de verwijdering gebruikt. Bijvoorbeeld,

 sed '/ ^ # / d' test.txt 

zal elke regel verwijderen die begint met "#" (met andere woorden, als je codeert, zullen al je opmerkingen worden verwijderd).

De algemene syntaxis is

 sed '/ regex / d' test.txt 

voor het verwijderen van de regel met de regex.

 sed '/ regex1 /, / regex2 / d' test.txt 

voor het verwijderen van het interval van de regel met regex1 naar de regel met regex2.

Het speciale teken ^ dat ik in het eerste voorbeeld heb gebruikt, geeft het begin van de regel aan.

Dan is het tweede basisgebruik dat ik kan bedenken substitutie. De algemene syntaxis is:

 sed -re's / regex1 / regex2 / 'test.txt 

Het zal voor effect hebben om in de eerste regel te zoeken naar regex1, het te vervangen door regex2, naar de volgende regel te gaan en te herhalen tot het einde van de invoerstroom.

Een goed voorbeeld is:

 sed -re's / ^ # * // 'test.txt 

Het vervangt het symbool "#" aan het begin van een regel en alle lege spaties met niets. Met andere woorden, het commentaar van het tekstbestand wordt niet overgenomen. Het symbool "*" is een meta-teken dat hier 0 of meer lege spaties ontwerpt.

gevorderd

Je kunt wat mooie dingen doen met sed, maar je zult de limiet behoorlijk snel bereiken als je geen aandacht besteedt aan het basisgedrag. Sed handelt lineair met flux: het past een regel-voor-regelbehandeling toe op een tekstbestand. Als u meer dan één wijziging op dezelfde regel wilt uitvoeren, moet u labels en meerregelige behandeling gebruiken. Dit alles kan erg complex worden, heel snel. Ik zal je nu enkele geavanceerde voorbeelden laten zien en ze aan je uitleggen. Als je meer wilt, ben ik er zeker van dat je alleen kunt zoeken en de basisprincipes kunt gebruiken die ik je heb gegeven.

Als u de lege regels van een bestand wilt verwijderen, kunt u de opdracht gebruiken

 sed -re '/ ^ $ / {N; D} 'test.txt 

Het metakarakter "$" betekent het einde van de regel, dus "^ $" ontwerpt een lege regel. Dan is "{N; D}" een vrij complexe syntaxis om die regel te verwijderen.

Als u elke tag in een html-bestand wilt verwijderen, is dit de opdracht voor u:

 sed -re ': start s /] *> // g; / 

De ": start" wordt een label genoemd. Het lijkt een beetje op een tag in het script die we later willen gebruiken om meerdere wijzigingen op dezelfde regel toe te passen. sed zoekt naar iets van de vorm "" (de regex] *>) en vervangt het door niets, dus de eerste html-tag van de regel wordt verwijderd. Maar voordat het naar de volgende regel gaat, controleert het of er iets anders is dat begint met "<" en als dat het geval is, gaat het terug naar het label ": start" en past het de behandeling opnieuw toe.

Conclusie

U bent nu klaar om dieper te studeren of gewoon te gebruiken voor eenvoudige aanpassingen. Het is een opdracht die ik vooral handig vind in scripts in het algemeen, maar het kostte me enige tijd om de syntaxis ervan te begrijpen. Ik hoop dat het veel sneller voor je zal zijn.

Ken je nog een basisbevel voor sed? Of gebruik je een ander geavanceerd script met sed dat je wilt delen? Laat het ons weten in de comments.