Het klinkt misschien gek, maar de Linux-sed commando is een tekst editor zonder een interface. U kunt gebruik maken van de opdrachtregel om te manipuleren van tekst in bestanden en streams. Wij laten u zien hoe om uit te rusten van haar macht.
De Macht van de sed
De sed-commando is een beetje net als met schaken: het duurt een uur om de basis te leren en onder de knie (of, in ieder geval veel van de praktijk). Wij tonen u een selectie van de opening acties in elk van de hoofdcategorieën van het sed-functionaliteit.
sed is een stream editor die werkt op doorgesluisd ingang of bestanden van de tekst. Het niet hebben van een interactieve tekst-editor-interface, echter. Integendeel, u instructies geven over het te volgen, omdat het werkt door de tekst. Dit werkt allemaal in Bash en andere commando-regel schelpen.
Met sed kunt u alle van de volgende:
- Tekst selecteren
- Vervang tekst
- Regels toevoegen aan tekst
- Verwijder regels van de tekst
- Wijzigen (of behouden) van een origineel bestand
We hebben gestructureerde onze voorbeelden te introduceren en demonstreren van concepten, niet om te produceren tersest (en minst toegankelijke) sed commando ‘ s. Echter, het patroon en de tekst selectie functionaliteiten van de sed zwaar afhankelijk van reguliere expressies (regexes). Je gaat nodig hebben enige vertrouwdheid met deze het beste te halen uit de sed.
GERELATEERD: het Gebruik van Reguliere Expressies (regexes) op Linux
Een Eenvoudig Voorbeeld
Eerst gaan we gebruiken echo om te sturen, de tekst sed door middel van een pijp, en hebben sed vervanging van een gedeelte van de tekst. Om dit te doen, typt u het volgende:
echo howtogonk | sed ‘s/gonk/geek/’
Het echo commando stuurt “howtogonk” in de sed, en onze eenvoudige substitutie regel (de “s” staat voor vervanging) wordt toegepast. sed zoekt de invoer tekst voor een exemplaar van de eerste reeks, en komt in de plaats van wedstrijden met het tweede.
De string “gonk” is vervangen door “geek” en de nieuwe snaar is afgedrukt in het terminal-venster.
Vervangingen zijn waarschijnlijk de meest voorkomende gebruik van sed. Voordat we een duik dieper in de wissels, maar we moeten weten hoe om te selecteren en matchen tekst.
Het Selecteren Van Tekst
We gaan naar een tekstbestand voor onze voorbeelden. We gebruiken bevat een selectie van gedichten van Samuel Taylor Coleridge ‘ s epische gedicht “The Rime of the Ancient Mariner.”
Wij typ het volgende om een kijkje te nemen bij het doen met minder:
minder coleridge.txt
Om een aantal regels uit het bestand, bieden we u de begin-en eindregels van de reeks wij willen selecteren. Een nummer kiest dat een lijn.
Uitpakken lijnen met één tot vier, wij typ de volgende opdracht:
sed -n ‘1,4 p’ coleridge.txt
Let op de komma tussen de 1 en 4. De p betekent “afdrukken gevonden regels.” Standaard, sed hiermee worden alle lijnen. Zouden We zien dat alle tekst in het bestand met de bijpassende lijnen twee keer. Om dit te voorkomen, gebruiken we de optie-n (rustige) optie voor het onderdrukken van de ongeëvenaarde tekst.
Als We de lijn nummers, dus kunnen we selecteer een ander vers, zoals hieronder weergegeven:
sed -n ‘6,9 p’ coleridge.txt
We kunnen gebruik maken van de -e (expression) optie om meerdere selecties maken. Met twee expressies, kunnen we kiezen uit twee verzen, zoals:
sed -n -e ‘1,4 p’ -e ‘31,34 p’ coleridge.txt
Als we verminderen het eerste nummer in de tweede expressie, kunnen we het invoegen van een spatie tussen de twee verzen. We typt u het volgende:
sed -n -e ‘1,4 p’ -e ‘30,34 p’ coleridge.txt
We kunnen ook kiezen voor een startlijn en vertellen sed stap voor stap door het bestand en print alternatieve lijnen, elke vijfde regel, of om naar een nummer van de lijnen. De opdracht is vergelijkbaar met die we hierboven gebruikte om een bereik te selecteren. Deze keer, echter, gebruiken we een tilde (~) in plaats van een komma te scheiden van de nummers.
Het eerste getal geeft de startlijn. Het tweede cijfer geeft sed welke lijnen na de start lijn die we willen zien. De nummer 2 verstaan elke van de tweede lijn, 3 betekent elke derde regel, enzovoort.
We typt u het volgende:
sed -n ‘1~2p’ coleridge.txt
Je zult niet altijd weet waar de tekst die u zoekt is gelegen in het bestand, wat betekent dat de regelnummers niet altijd veel helpen. U kunt echter ook gebruik maken van de sed om lijnen te selecteren met bijpassende tekst patronen. Bijvoorbeeld, laten we het uitpakken van alle regels die beginnen met ‘En’.
De caret (^) vertegenwoordigt het begin van de regel. We zullen omsluiten onze zoekterm in voorwaartse slashes (/). We hebben ook een spatie na “En” dus woorden als “Android” niet in het resultaat opgenomen.
Het lezen van het sed-scripts kunnen worden een beetje moeilijk op het eerste. De /p betekent ‘afdrukken’, net zoals het deed in de opdrachten die we hierboven gebruikte. In de volgende opdracht, hoewel, een slash aan vooraf gaat:
sed -n ‘/^En /p’ coleridge.txt
Drie lijnen die beginnen met “En” zijn ontleend aan het bestand en weergegeven voor ons.
Het Maken Van Vervangingen
In ons eerste voorbeeld, toonden we u het volgende basis formaat voor een sed-vervanging:
echo howtogonk | sed ‘s/gonk/geek/’
De s vertelt sed dit is een vervanging. De eerste reeks is het zoek patroon, en de tweede is de tekst die we willen vervangen overeenkomende tekst. Natuurlijk, zoals met alle dingen Linux, de duivel zit in de details.
Wij typ het volgende om alle exemplaren van “dag” tot “week,” en geef de mariner en albatross meer tijd om de obligatie:
sed -n ‘s/dag/week/p’ coleridge.txt
In de eerste lijn, alleen het tweede exemplaar van de “dag” is veranderd. Dit is omdat sed stopt na de eerste wedstrijd per lijn. We hebben voor het toevoegen van een “g” op het einde van de expressie, zoals hieronder weergegeven voor het uitvoeren van een globale zoekopdracht, zodat alle wedstrijden in elke lijn worden verwerkt:
sed -n ‘s/dag/week/gp’ coleridge.txt
Dit komt overeen met drie van de vier in de eerste lijn. Omdat het eerste woord is “Dag” en sed is hoofdletter-gevoelig, het houdt geen rekening met die aanleg hetzelfde als “dag.”
Wij typ het volgende, het toevoegen van een ik tot de opdracht aan het einde van de uitdrukking om aan te geven zaak-ongevoeligheid:
sed -n ‘s/dag/week/gip’ coleridge.txt
Dit werkt, maar je zou het niet altijd wilt inschakelen geval-ongevoeligheid voor alles. In die gevallen kunt u gebruik maken van een reguliere groep toe te voegen patroon-specifieke geval-ongevoeligheid.
Bijvoorbeeld, als wij voegen tekens tussen de vierkante haakjes ([]), ze worden geïnterpreteerd als “een teken uit deze lijst van karakters.”
Wij typ de volgende, en omvatten “D” en “d” in de groep, om te waarborgen dat deze overeenkomt met zowel de “Dag” en “dag”:
sed -n ‘s/[Dd]ay/week/gp’ coleridge.txt
We kunnen ook alleen de vervanging van delen van het bestand. Laten we zeggen dat ons bestand bevat raar afstand in het eerste vers. We kunnen gebruik maken van de volgende bekende commando om te zien het eerste vers:
sed -n ‘1,4 p’ coleridge.txt
We zoeken twee spaties en vervang ze met een. We doen dit wereldwijd zo de actie wordt herhaald over de gehele lijn. Om duidelijk te zijn, het zoeken patroon is ruimte, ruimte asterisk (*), en de vervangende tekenreeks is een enkele spatie. De 1,4 beperkt de substitutie naar de eerste vier regels van het bestand.
Zetten We dat allemaal samen in de volgende opdracht:
sed -n ‘1,4 s/ */ /gp’ coleridge.txt
Dit werkt goed! De zoekopdracht is belangrijk. De asterisk (*) stelt nul of meer van het vorige karakter, dat is een ruimte. Dus, het zoekpatroon is op zoek naar snaren van een ruimte of meer.
Als we vervangen van één enkele ruimte voor een reeks van meerdere ruimten, we zullen het bestand terug naar een vaste afstand, met een enkele spatie tussen ieder woord. Dit zal ook vervangen door een enkele ruimte voor een enkele ruimte in sommige gevallen, maar dit zal niet van invloed zijn op iets negatief—we nog steeds voor ons gewenste resultaat.
Als we het volgende te typen en het verminderen van de zoekopdracht om een enkele ruimte, zie je meteen waarom die we hebben om twee ruimtes:
sed -n ‘1,4 s/ */ /gp’ coleridge.txt
Omdat het sterretje overeenkomt met nul of meer van het voorgaande teken, het ziet elk karakter dat niet in een ruimte als een “nul-ruimte” en is van toepassing op de vervanging aan.
Echter, als we twee ruimtes in de zoekopdracht, sed moet ten minste één spatie voor de toepassing van de substitutie. Dit zorgt ervoor nonspace tekens onaangeroerd zal blijven.
Wij typ de volgende, met behulp van de -e (expressie) we eerder gebruikt, die ons in staat stelt om twee of meer vervangingen tegelijk:
sed -n -e ‘s/motion/flutter/gip’ -e ‘s/ocean/goot/gip’ coleridge.txt
Kunnen We hetzelfde resultaat bereiken als we een puntkomma (;) tussen de twee uitdrukkingen, zoals:
sed -n ‘s/motion/flutter/gip;s/ocean/goot/gip’ coleridge.txt
Wanneer we verwisseld “dag” voor “week” in de volgende opdracht, de aanleg van de “dag” in de uitdrukking “een-dag” was verwisseld en:
sed -n ‘s/[Dd]ay/week/gp’ coleridge.txt
Om dit te voorkomen, we kunnen alleen proberen vervangingen op lijnen die overeenkomen met een patroon. Wanneer passen we de opdracht om een zoekopdracht in het begin zullen we alleen rekening houden met de exploitatie op die lijnen die overeenkomen met het patroon.
Wij typ het volgende om onze bijpassende patroon het woord “na”:
sed -n ‘/na/ s/[Dd]ay/week/gp’ coleridge.txt
Dat geeft ons het antwoord we willen.
Meer Complexe Vervangingen
Laten we Coleridge een pauze en het gebruik van sed uitpakken namen van de etc/passwd bestand.
Er zijn kortere manieren om dit te doen (daarover later meer), maar we gebruiken de langere weg hier naar aantonen dat een ander concept. Elke overeenkomende item in een zoekopdracht (de zogenaamde sub-expressies) kunnen worden genummerd (tot een maximum van negen items). Vervolgens kunt u deze nummers in uw sed commando ‘ s om te verwijzen naar specifieke sub-expressies.
U plaatst de sub-expressie tussen haakjes [()] voor dit werk. De haakjes ook moet worden voorafgegaan door een backslash () om te voorkomen dat ze worden behandeld als een normale karakter.
Om dit te doen, typt u het volgende:
sed ‘s/([^:]*).*/1/’ /etc/passwd
Laten we breken:
- sed ‘s/: De sed-commando en het begin van de vervanging expressie.
- (: Het openingshaakje [(] bijvoeging van de sub-expressie, voorafgegaan door een backslash ().
- [^:]*: Het eerste sub-expressie van de zoekterm bevat een groep tussen vierkante haakjes. De caret (^) betekent “niet” wanneer in een groep. Een groep betekent dat elk teken dat niet een dubbele punt (:) zal worden beschouwd als een wedstrijd.
- ): Het sluithaakje [)] voorafgegaan door een backslash ().
- .*: Deze tweede zoeken subexpressie “elke karakter en een aantal van hen.”
- /1: De substitutie deel van de expressie bevat 1 voorafgegaan door een backslash (). Dit is de tekst die overeenkomt met de eerste sub-expressie.
- /’: De afsluitende slash (/) en enkele aanhalingstekens (‘) ontbinding van de sed-commando.
Wat dit allemaal betekent is dat we gaan kijken voor een willekeurige reeks tekens die niet bevatten een dubbele punt (:), die zal worden het eerste exemplaar van bijpassende tekst. Dan zijn wij op zoek bent naar iets anders op die lijn, die de tweede exemplaar van bijpassende tekst. We gaan ter vervanging van de gehele lijn met de tekst die overeenkomt met de eerste sub-expressie.
Elke regel in het /etc/passwd bestand begint met een colon-beëindigd gebruikersnaam. We passen alles tot en met de eerste dubbele punt en vervolgens vervangen door die waarde voor de gehele lijn. We hebben dus geïsoleerd van de gebruikersnamen.
We gaan omsluiten de tweede sub-expressie tussen haakjes [()], zodat we kunnen verwijzen naar het aantal, als goed. We zullen ook vervangen 1 2. Onze opdracht nu vervangen door de gehele lijn met alles van de eerste dubbele punt (:) aan het einde van de lijn.
We typt u het volgende:
sed ‘s/([^:]*)(.*)/2/’ /etc/passwd
Die kleine veranderingen omkeren van de betekenis van de opdracht, en we krijgen alles, behalve de gebruikersnamen.
Nu, laten we eens een kijkje nemen op de snelle en gemakkelijke manier om dit te doen.
Onze zoekterm is van de eerste dubbele punt (:) aan het einde van de lijn. Omdat onze substitutie-expressie is leeg (//), gaan we niet aan het vervangen van de gematchte tekst met iets.
Dus, wij typ het volgende in het afslaan van alles, van de eerste dubbele punt (:) aan het einde van de lijn, zodat alleen de gebruikersnamen:
sed ‘s/:.*//” /etc/passwd
Laten we eens kijken naar een voorbeeld waarbij we verwijzen naar de eerste en de tweede wedstrijden in dezelfde opdracht.
We hebben een bestand van komma ‘ s (,) het scheiden van de eerste en de laatste namen. We willen een lijst van hen als “achternaam, voornaam.” We kunnen gebruik maken van de kat, zoals hieronder weergegeven, om te zien wat er in het bestand:
kat geeks.txt
Zoals veel van de sed-commando ‘ s, deze zien er misschien ondoordringbare ten eerste:
sed ‘s/^(.*),(.*)$/2,1 /g’ geeks.txt
Dit is een vervangende opdracht als de anderen die we hebben gebruikt, en het zoeken patroon is heel eenvoudig. We breken het hieronder:
- sed ‘s/: De normale vervanging opdracht.
- ^: Omdat de cursor niet in een groep ([]), betekent “het begin van De regel.”
- (.*),: De eerste sub-expressie is een willekeurig aantal tekens. Het is tussen haakjes [()], elk voorafgegaan door een backslash ( ), dus we kunnen verwijzen naar het nummer. Onze gehele zoeken patroon zo ver vertaalt zoeken vanaf het begin van de line-up voor de eerste komma (,) voor een willekeurig aantal tekens.
- (.*): De volgende sub-expressie is (weer) een willekeurig aantal willekeurig teken. Het is ook tussen haakjes [()], beiden voorafgegaan door een backslash ( ), dus we kunnen verwijzen naar de overeenkomende tekst van het aantal.
- $/: Het dollar-teken ($) vertegenwoordigt het einde van de regel en zal onze zoektocht voort te zetten naar het eind van de lijn. Wij hebben dit gewoon om de invoering van de dollar-teken. We hoeven niet echt het hier, zoals het sterretje (*) zou gaan om het einde van de regel in dit scenario. De slash (/) maakt het zoeken gedeelte patroon.
- 2,1 /g’: Omdat we afgesloten met onze twee sub-expressies tussen haakjes kunnen we verwijzen naar hen beiden door hun nummers. Want we willen in omgekeerde volgorde, typen we ze als tweede wedstrijd,de eerste wedstrijd. De cijfers moeten worden voorafgegaan door een backslash ().
- /g: Dit staat voor onze opdracht om te werken wereldwijd op elke lijn.
- geeks.txt: Het bestand waar we aan werken.
U kunt ook gebruik maken van de opdracht Knippen (c) te vervangen door hele lijnen die overeenkomen met uw zoekopdracht. Wij typ het volgende om te zoeken naar een regel met het woord “nek”, en vervang deze met een nieuwe reeks tekst:
sed ‘/nek/c Rond mijn pols was geregen’ coleridge.txt
Onze nieuwe regel wordt nu weergegeven aan de onderkant van onze extract.
Plaatsen van Lijnen en Tekst
Ook kunnen wij u nieuwe lijnen en tekst in ons bestand. Invoegen van nieuwe lijnen na de bijpassende degenen, gebruiken we de opdracht Append (a).
Hier is de file gaan we aan de slag met:
kat geeks.txt
We hebben de genummerde lijnen maken dit een stuk makkelijker om te volgen.
Wij typ de volgende regels zoeken die bevatten het woord “Hij” en voeg een nieuwe regel onder hen:
sed ‘/Hij/a –> Ingevoegd!’ geeks.txt
We typt u het volgende en omvatten de Opdracht Insert (i) tot het invoegen van de nieuwe lijn boven degenen, die met bijpassende tekst:
sed ‘/Hij/i –> Ingevoegd!’ geeks.txt
We kunnen gebruik maken van de ampersand (&), hetgeen overeenkomt met de oorspronkelijke overeenkomende tekst, toe te voegen nieuwe tekst naar een overeenkomende regel. 1 , 2, en zo verder, vertegenwoordigen bijpassende sub-expressies.
Om tekst toe te voegen aan het begin van een regel, zullen we gebruik maken van een vervangende opdracht die overeenkomt met alles op de lijn, gecombineerd met een vervangend beding dat combineert onze nieuwe tekst met de oorspronkelijke lijn.
Om dit allemaal te kunnen, typen we het volgende:
sed ‘s/.*/–> Geplaatst &/’ geeks.txt
Wij typ de volgende, met inbegrip van de G-opdracht, die zal het toevoegen van een witregel tussen elke regel:
sed ‘G’ geeks.txt
Als u wilt toevoegen van twee of meer lege regels, kunt u gebruik maken van de G, G, G, G, G, en zo verder.
Het Verwijderen Van Lijnen
De opdracht Verwijderen (d) verwijdert lijnen die overeenkomen met een patroon zoeken, of die zijn opgegeven met de regelnummers of bereiken.
Bijvoorbeeld, verwijder de derde lijn, dan zouden we typt u het volgende:
sed ‘3d’ geeks.txt
Verwijderen van de verschillende lijnen van vier tot vijf, zouden we het volgende te typen:
sed ‘4,5 d’ geeks.txt
Verwijderen regels buiten een bereik, we maken gebruik van een uitroepteken (!), zoals hieronder weergegeven:
sed ‘6,7!d’ geeks.txt
Het Opslaan Van Uw Wijzigingen
Zo ver, al onze resultaten zijn afgedrukt en naar de terminal-venster, maar we zijn nog niet gered zijn ze overal. Om deze permanente, kunt u ofwel het schrijven van de wijzigingen in het oorspronkelijke bestand of om te buigen naar een nieuwe.
Overschrijven van het originele bestand vereist enige voorzichtigheid. Als uw sed commando is verkeerd, je zou een aantal wijzigingen in het oorspronkelijke bestand dat moeilijk ongedaan te maken.
Voor sommige vrede van de geest, sed kan het maken van een back-up van het originele bestand voordat het uitvoeren van de opdracht.
U kunt gebruik maken van de In-place ‘ – optie (-i) te vertellen sed om de veranderingen schrijven naar het oorspronkelijke bestand, maar als u een bestandsextensie toevoegen aan het, sed back-up van het originele bestand naar een nieuwe. Het heeft dezelfde naam als het originele bestand, maar met een nieuw bestand met de extensie.
Om aan te tonen, zullen we zoeken naar lijnen die bevatten het woord “Hij” en verwijder ze. We zullen ook een back-up van onze originele bestand onder een nieuwe aan de hand van de BAK extensie.
Om dit allemaal te kunnen, typen we het volgende:
sed -i’.bak’ ‘/^.*Hij.*$/d’ geeks.txt
Wij typ het volgende om ervoor te zorgen dat onze back-up bestand is ongewijzigd:
kat geeks.txt.bak
We kunnen ook de volgende omleiden naar een nieuw bestand en het bereiken van een soortgelijk resultaat:
sed -i’.bak’ ‘/^.*Hij.*$/d’ geeks.txt > new_geeks.txt
We gebruiken kat om de wijzigingen te bevestigen zijn geschreven naar het nieuwe bestand, zoals hieronder weergegeven:
kat new_geeks.txt
Met sed Alle Die
Zoals je waarschijnlijk wel hebt gemerkt, zelfs in deze quick primer op sed is vrij lang. Er is veel om deze opdracht, en er is nog meer kunnen doen.
Hopelijk wel, deze fundamentele concepten hebben een stevige basis waarop u kunt bouwen als u verder om meer te leren.
LEES VERDER
- “Hoe Remap Controller Knoppen op de Nintendo Schakelaar
- “5G samenzweringstheorieën: De Gekste e-Mails die We hebben Gekregen
- “Hoe Verplaats Gedownloade Nintendo Switch Spellen op de microSD-Kaart
- “Wat is NBC’ s Peacock Streaming Service, en Wat Blijkt, Zal Het Bieden?
- “Hoe Gebruik Zappy, een Nieuwe Screenshot en Annotatie Tool voor Mac