Welcome to Our Website

De basis van het gebruik van de SED Stream Editor om tekst in Linux te manipuleren

Inleiding

het sed Commando, kort voor stream editor, voert bewerkingen uit op tekst afkomstig van standaard invoer of een bestand. sed bewerkt regel-voor-regel en op een niet-interactieve manier.

Dit betekent dat u alle bewerkingsbeslissingen neemt terwijl u het commando aanroept, en sed voert de aanwijzingen automatisch uit., Dit lijkt misschien verwarrend of niet intuïtief, maar het is een zeer krachtige en snelle manier om tekst te transformeren, vooral als onderdeel van een script of geautomatiseerde workflow.

Deze tutorial zal enkele basisbewerkingen behandelen en u kennis laten maken met de syntaxis die nodig is om deze editor te bedienen. U zult vrijwel zeker nooit uw reguliere teksteditor vervangen door sed, maar het zal waarschijnlijk een welkome aanvulling worden op uw tekstbewerkingstoolbox.

Opmerking: Deze tutorial gebruikt de GNU-versie van sed gevonden op Ubuntu en andere Linux-besturingssystemen., Als u macOS gebruikt, hebt u de BSD-versie met verschillende opties en argumenten. U kunt de GNU-versie van sed installeren met Homebrew met brew install gnu-sed.

Start een interactieve Terminal!

basisgebruik

sed werkt op een tekststroom die wordt gelezen vanuit een tekstbestand of standaardinvoer (STDIN). Dit betekent dat u de uitvoer van een ander commando direct naar sed kunt sturen voor bewerking, of u kunt werken aan een bestand dat u al hebt aangemaakt.,

u moet zich er ook van bewust zijn dat sed standaard alles naar standard out (STDOUT) uitvoert. Dat betekent dat, tenzij omgeleid, sed de uitvoer naar het scherm zal afdrukken in plaats van het op te slaan in een bestand.

het basisgebruik is:

  • sed commands

In deze handleiding gebruikt u een kopie van de BSD-softwarelicentie om te experimenteren met sed., Voer op Ubuntu de volgende opdrachten uit om het BSD-licentiebestand naar uw persoonlijke map te kopiëren zodat u ermee kunt werken:

  • cd
  • cp /usr/share/common-licenses/BSD .

Als u geen lokale kopie van de BSD-licentie hebt, maak er dan zelf een aan met dit commando:

  • cat << 'EOF' > BSD
  • Copyright (c) The Regents of the University of California.
  • All rights reserved.
  • Redistribution and use in source and binary forms, with or without
  • modification, are permitted provided that the following conditions
  • are met:
  • 1. Redistributions of source code must retain the above copyright
  • notice, this list of conditions and the following disclaimer.
  • 2. Redistributions in binary form must reproduce the above copyright
  • notice, this list of conditions and the following disclaimer in the
  • documentation and/or other materials provided with the distribution.
  • 3. Neither the name of the University nor the names of its contributors
  • may be used to endorse or promote products derived from this software
  • without specific prior written permission.
  • THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  • ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  • IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  • ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  • FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  • DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  • OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  • HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  • LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  • OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  • SUCH DAMAGE.
  • EOF

laten we sed gebruiken om te bekijken de inhoud van het BSD-licentiebestand. sed stuurt zijn resultaten standaard naar het scherm, wat betekent dat u het als een bestandslezer kunt gebruiken door het zonder bewerkingscommando ‘ s door te geven., Probeer het volgende commando uit te voeren:

  • sed '' BSD

u ziet de BSD-licentie op het scherm:

Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.......

de enkele aanhalingstekens bevatten de bewerkingscommando ‘ s die u doorgeeft aan sed. In dit geval gaf je het niets door, dus sed printte elke ontvangen regel naar standaarduitvoer.

sed kan standaardinvoer gebruiken in plaats van een bestand., Pipe the output of the cat Commando into sed om hetzelfde resultaat te produceren:

  • cat BSD | sed ''

u zult de uitvoer van het bestand zien:

Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.. . .. . .

zoals u kunt zien, kunt u werken op Bestanden of streams van tekst, zoals die geproduceerd worden bij het piping uitvoer met de pipe (|) karakter, net zo gemakkelijk.

Afdrukregels

in het vorige voorbeeld zag u dat invoer werd doorgegeven aan sed zonder enige bewerking de resultaten rechtstreeks naar de standaarduitvoer zou afdrukken.,

laten we eens verkennen sed’s expliciete print Commando, die u opgeeft met behulp van het p teken binnen enkele aanhalingstekens.

voer het volgende commando uit:

  • sed 'p' BSD

u ziet elke regel van het BSD bestand tweemaal afgedrukt:

Output
Copyright (c) The Regents of the University of California.Copyright (c) The Regents of the University of California.All rights reserved.All rights reserved.Redistribution and use in source and binary forms, with or withoutRedistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsmodification, are permitted provided that the following conditionsare met:are met:. . .. . .

sed drukt standaard automatisch elke regel af, en dan heb je het verteld om regels expliciet af te drukken met het “p” commando, dus je krijgt elke regel twee keer afgedrukt.,

Als u de uitvoer nauwkeurig bekijkt, zult u zien dat deze de eerste regel tweemaal heeft, gevolgd door de tweede regel tweemaal, etc, die u vertelt dat sed Op data regel voor regel werkt. Het leest een regel, werkt erop, en voert de resulterende tekst uit voordat het proces op de volgende regel wordt herhaald.

u kunt de resultaten opschonen door de optie -n door te geven aan sed, wat het automatisch afdrukken onderdrukt:

  • sed -n 'p' BSD
Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.. . .. . .

We gaan nu weer elke regel één keer afdrukken.,

De voorbeelden tot nu toe kunnen nauwelijks worden beschouwd als bewerken (tenzij u elke regel twee keer wilt afdrukken…). Vervolgens zult u onderzoeken hoe sed de uitvoer kan wijzigen door specifieke secties van de tekstgegevens te targeten.

met adresbereiken

kunt u specifieke delen van een tekststream benaderen. U kunt een specifieke lijn of zelfs een reeks regels opgeven.

laten we sed de eerste regel van het bestand afdrukken., Voer het volgende commando uit:

  • sed -n '1p' BSD

de eerste regel wordt afgedrukt naar het scherm:

Output
Copyright (c) The Regents of the University of California.

door het nummer 1 Voor het print Commando gaf u aan sed het regelnummer om op te werken. U kunt net zo gemakkelijk vijf regels afdrukken (vergeet de “-n”niet):

  • sed -n '1,5p' BSD

u zult deze uitvoer zien:

Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditions

u hebt zojuist een adresbereik gegeven aan sed., Als u sed een adres geeft, zal het alleen de commando ‘ s uitvoeren die op die regels volgen. In dit voorbeeld heb je sed verteld regel 1 tot en met regel 5 af te drukken. U had dit op een andere manier kunnen specificeren door het eerste adres op te geven en vervolgens een offset te gebruiken om sed te vertellen hoeveel extra regels er moeten worden afgelegd, zoals dit:

  • sed -n '1,+4p' BSD

Dit zal resulteren in dezelfde uitvoer, omdat u sed hebt verteld om te beginnen op Regel 1 en vervolgens ook op de volgende 4 regels te werken.,

Als u elke andere regel wilt afdrukken, geeft u het interval op na het teken ~. Het volgende commando drukt elke andere regel af in het BSD bestand, beginnend met Regel 1:

  • sed -n '1~2p' BSD

Hier is de uitvoer die u zult zien:

Output
Copyright (c) The Regents of the University of California.modification, are permitted provided that the following conditions1. Redistributions of source code must retain the above copyright2. Redistributions in binary form must reproduce the above copyright documentation and/or other materials provided with the distribution. may be used to endorse or promote products derived from this software. . .. . .

u kunt sed gebruiken om tekst te verwijderen van de uitgang ook.,

tekst verwijderen

u kunt tekstverwijdering uitvoeren waar u eerder tekstafdrukwerk specificeerde door de opdracht p te wijzigen in de opdracht d.

in dit geval heeft u het commando -n niet langer nodig omdat sed alles zal afdrukken dat niet verwijderd is. Dit zal je helpen te zien wat er aan de hand is.,

Wijzig het laatste commando uit de vorige sectie zodat het
elke andere regel verwijdert, beginnend met de eerste:

  • sed '1~2d' BSD

het resultaat is dat u elke regel ziet die u de laatste keer niet kreeg:

Output
All rights reserved.Redistribution and use in source and binary forms, with or withoutare met: notice, this list of conditions and the following disclaimer. notice, this list of conditions and the following disclaimer in the3. Neither the name of the University nor the names of its contributors without specific prior written permission.. . .. . .

Het is belangrijk om hier op te merken dat ons bronbestand niet wordt beïnvloed. Het is nog intact. De bewerkingen worden uitgevoerd naar ons scherm.,

Als we willen zuinig zijn op onze bewerkt, kunnen we de standaard output omleiden naar een bestand, zoals:

  • sed '1~2d' BSD > everyother.txt

open Nu het bestand met cat:

  • cat everyother.txt

zie Je dezelfde uitgang die u zag op het scherm eerder:

Output
All rights reserved.Redistribution and use in source and binary forms, with or withoutare met: notice, this list of conditions and the following disclaimer. notice, this list of conditions and the following disclaimer in the3. Neither the name of the University nor the names of its contributors without specific prior written permission.. . .. . .

De sed commando niet bewerk het bron-bestand, maar u kunt dit gedrag wijzigen door het doorgeven van de -i optie, wat betekent “het uitvoeren van bewerkingen in-plaats.”Dit zal het bronbestand veranderen.,

waarschuwing: het gebruik van de schakelaar -i zal het originele bestand overschrijven, dus gebruik dit voorzichtig. Voer de bewerkingen uit zonder de schakelaar -i en voer het commando opnieuw uit met -i als je eenmaal hebt wat je wilt, maak dan een back-up van het originele bestand, of leid de uitvoer naar een bestand. Het is heel gemakkelijk om per ongeluk het originele bestand te veranderen met de -i switch.

laten we het proberen door het everyother.txt bestand te bewerken dat u zojuist hebt aangemaakt., Laten we het bestand verder verkleinen door elke andere regel
opnieuw te verwijderen:

  • sed -i '1~2d' everyother.txt

Als u cat gebruikt om het bestand weer te geven met cat everyother.txt, zult u zien dat het bestand is bewerkt.

de optie -i kan gevaarlijk zijn. Gelukkig geeft sed u de mogelijkheid om een back-upbestand aan te maken voordat u het bewerkt.,

om een back-upbestand te maken voorafgaand aan het bewerken, voegt u de back-up extensie direct toe na de optie “- i”:

  • sed -i.bak '1~2d' everyother.txt

Dit maakt een back-upbestand aan met de .bak extensie, en bewerkt vervolgens het originele bestand op zijn plaats.

hierna zult u zien hoe u sed kunt gebruiken om Zoek-en vervangoperaties uit te voeren.

Tekst vervangen

misschien is het meest bekende gebruik voor sed het vervangen van tekst., sed kan zoeken naar tekstpatronen met behulp van reguliere expressies, en dan de gevonden tekst vervangen door iets anders.

u kunt meer te weten komen over reguliere expressies door het gebruik van Grep reguliere expressies te volgen om te zoeken naar tekstpatronen in Linux.

in zijn meest basale vorm kunt u het ene woord in het andere Woord veranderen met de volgende syntaxis:

's/old_word/new_word/'

de s is het vervangende Commando. De drie schuine strepen (/) worden gebruikt om de verschillende tekstvelden te scheiden., U kunt andere tekens gebruiken om de velden af te bakenen als het meer nuttig zou zijn.

bijvoorbeeld, als u een websitenaam probeert te veranderen, zou het gebruik van een ander scheidingsteken nuttig zijn omdat URL ‘ s slashes bevatten.

voer het volgende commando uit om een URL af te drukken met echo en wijzig het met sed, gebruikmakend van het underscore (_) teken als het scheidingsteken:

  • echo "http://www.example.com/index.html" | sed 's_com/index_org/home_'

Dit vervangt com/index door org/home., De uitvoer toont de aangepaste URL:

Output

Do not forget the final delimiter, or sed will complain. If you ran this command:

  • echo "http://www.example.com/index.html" | sed 's_com/index_org/home'

u ziet deze uitvoer:

Output
sed: -e expression #1, char 20: unterminated `s' command

laten we een nieuw bestand maken om enkele substituties te oefenen. Voer het volgende commando uit om een nieuw tekstbestand aan te maken met de naam song.txt:

  • echo "this is the song that never ends
  • yes, it goes on and on, my friend
  • some people started singing it
  • not knowing what it was
  • and they'll continue singing it forever
  • just because..." > song.txt

laten we nu de uitdrukking on vervangen door forward. Gebruik het volgende commando:

  • sed 's/on/forward/' song.txt

De uitvoer ziet er als volgt uit:

Output
this is the sforwardg that never endsyes, it goes forward and on, my friendsome people started singing itnot knowing what it wasand they'll cforwardtinue singing it foreverjust because...

u kunt hier een paar opmerkelijke dingen zien., Ten eerste, is dat sed vervangen patronen, geen woorden. De on binnen song wordt gewijzigd in forward.

het andere ding om op te merken is dat op Regel 2, de tweede on niet werd gewijzigd in forward.

Dit is omdat standaard hets commando werkt op de eerste overeenkomst in een regel en dan naar de volgende regel gaat., Om sed elke instantie van on te laten vervangen in plaats van alleen de eerste op elke regel, moet u een optionele vlag doorgeven aan het substitute Commando.

Geef de vlag g aan het substitute Commando door het na de substitutieset te plaatsen:

  • sed 's/on/forward/g' song.txt

u zult deze uitvoer zien:

Output
this is the sforwardg that never endsyes, it goes forward and forward, my friendsome people started singing itnot knowing what it wasand they'll cforwardtinue singing it foreverjust because...

nu verandert het substitute Commando elke instantie.,

Als u wilde alleen maar om het tweede exemplaar van “on” sed vindt op elke regel, dan zou u het gebruik van het nummer 2 in plaats van de g:

  • sed 's/on/forward/2' song.txt

Deze keer de andere lijnen onveranderd zijn, als ze niet een tweede exemplaar:

Output
this is the song that never endsyes, it goes on and forward, my friendsome people started singing itnot knowing what it wasand they'll continue singing it foreverjust because...

Als u wilt zien welke lijnen werden vervangen, gebruik je de -n optie weer te onderdrukken automatisch afdrukken.,

u kunt dan de optie p doorgeven aan het substitute commando om regels af te drukken waar substitutie plaatsvond.

  • sed -n 's/on/forward/2p' song.txt

de regel die veranderd print naar het scherm:

Output
yes, it goes on and forward, my friend

zoals u kunt zien, kunt u de vlaggen aan het einde van het commando combineren.

als u wilt dat het zoekproces hoofdletters negeert, kunt u het de “I” vlag geven.,

  • sed 's/SINGING/saying/i' song.txt

Hier is de uitvoer die u zult zien:

Output
this is the song that never endsyes, it goes on and on, my friendsome people started saying itnot knowing what it wasand they'll continue saying it foreverjust because...

vervangen en verwijzen naar overeenkomende tekst

Als u complexere patronen met reguliere expressies wilt vinden, hebt u een aantal verschillende methoden om naar het overeenkomende patroon te verwijzen in de vervangende tekst.,

bijvoorbeeld, om te matchen vanaf het begin van de regel met at, gebruik het volgende commando:

  • sed 's/^.*at/REPLACED/' song.txt

u zult deze uitvoer zien:

Output
REPLACED never endsyes, it goes on and on, my friendsome people started singing itREPLACED it wasand they'll continue singing it foreverjust because...

u kunt zien dat de jokertekens overeenkomen vanaf het begin van de regel tot de laatste instantie van at.

omdat u de exacte zin niet kent die overeenkomt met de zoekterm, kunt u het teken & gebruiken om de overeenkomende tekst in de vervangende tekenreeks weer te geven.,

laten we haakjes zetten rond de overeenkomende tekst:

  • sed 's/^.*at/(&)/' song.txt

u zult deze uitvoer zien:

Output
(this is the song that) never endsyes, it goes on and on, my friendsome people started singing it(not knowing what) it wasand they'll continue singing it foreverjust because...

een meer flexibele manier om naar overeenkomende tekst te verwijzen is door escaped haakjes te gebruiken om secties van overeenkomende tekst te groeperen.

elke groep van zoektekst gemarkeerd met haakjes kan worden verwezen door een ontsnapte referentienummer. Bijvoorbeeld, de eerste haakjes groep kan worden verwezen met \1, de tweede met \2 enzovoort.,

in dit voorbeeld schakelen we de eerste twee woorden van elke regel:

  • sed 's/\(*\) \(*\)/\2 \1/' song.txt

u zult deze uitvoer zien:

Output
is this the song that never endsyes, goes it on and on, my friendpeople some started singing itknowing not what it wasthey and'll continue singing it foreverbecause just...

zoals u kunt zien, zijn de resultaten niet perfect. Bijvoorbeeld, de tweede regel slaat het eerste woord over omdat het een karakter heeft dat niet in onze tekenset staat. Ook werd they'll behandeld als twee woorden in de vijfde regel.

laten we de reguliere expressie nauwkeuriger maken:

  • sed 's/\(*\) \(*\)/\2 \1/' song.txt

u zult deze uitvoer zien:

Output
is this the song that never endsit yes, goes on and on, my friendpeople some started singing itknowing not what it wasthey'll and continue singing it foreverbecause... just

Dit is veel beter dan de vorige keer., Dit groepeert interpunctie met het bijbehorende woord.

merk op hoe we de uitdrukking tussen de haakjes herhalen (eenmaal zonder het * teken, en dan eenmaal ermee). Dit komt omdat het* karakter overeenkomt met de tekenset die ervoor komt, nul of meer keren. Dit betekent dat de match met het jokerteken wordt beschouwd als een “match”, zelfs als het patroon niet wordt gevonden.

om er zeker van te zijn dat sed de tekst ten minste één keer vindt, moet u deze één keer matchen zonder de Joker voordat u de Joker gebruikt.,

conclusie

In deze tutorial heeft u hetsed Commando onderzocht. U hebt specifieke regels uit het bestand afgedrukt, naar tekst gezocht, Regels verwijderd, het oorspronkelijke bestand overgeschreven en reguliere expressies gebruikt om tekst te vervangen. Je zou al moeten kunnen zien hoe je snel een tekstdocument kunt transformeren met behulp van goed geconstrueerde sed commando ‘ s.

in het volgende artikel in deze serie, zult u enkele meer geavanceerde functies verkennen.

Geef een reactie

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