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
.
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:
OutputCopyright (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:
OutputCopyright (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:
OutputCopyright (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
OutputCopyright (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:
OutputCopyright (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:
OutputCopyright (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:
OutputCopyright (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:
OutputAll 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:
OutputAll 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:
Outputsed: -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:
Outputthis 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:
Outputthis 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:
Outputthis 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:
Outputyes, 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:
Outputthis 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.