te vinden en te vervangen wanneer u met tekstbestanden werkt, zult u vaak tekenreeksen in een of meer bestanden moeten vinden en vervangen.
sed is een stream-editor. Het kan basistekstmanipulatie uitvoeren op Bestanden en invoerstromen zoals pijpleidingen. Met sed kunt u woorden en regels zoeken, vinden en vervangen, invoegen en verwijderen. Het ondersteunt basis-en uitgebreide reguliere expressies waarmee u complexe patronen kunt matchen.,
in dit artikel zullen we het hebben over het vinden en vervangen van tekenreeksen door sed. We laten u ook zien hoe u een recursieve zoekopdracht en vervanging uitvoert.
Zoek en vervang tekenreeks door sed #
er zijn verschillende versies van sed, met enkele functionele verschillen tussen hen. macOS gebruikt de BSD-versie, terwijl de meeste Linux-distributies standaard GNU sed voorgeïnstalleerd hebben. We gebruiken de GNU-versie.,
de algemene vorm van het zoeken en vervangen van tekst met behulp van sed neemt de volgende vorm aan:
sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
-
-i– standaard schrijftsedzijn uitvoer naar de standaard uitgang. Deze optie verteltsedom bestanden te bewerken. Als een extensie wordt geleverd (ex-i. bak), wordt een back-up van het oorspronkelijke bestand gemaakt. -
s– het substitute Commando, waarschijnlijk het meest gebruikte commando in sed. -
/ / /– scheidingsteken., Het kan elk teken zijn, maar meestal wordt het slash (/) teken gebruikt. -
SEARCH_REGEX– normale tekenreeks of een reguliere expressie om naar te zoeken. -
REPLACEMENT– de vervangende tekenreeks. -
g– globale vervangingsvlag. Standaard leestsedregel voor Regel het bestand en verandert alleen het eerste voorkomen van deSEARCH_REGEXop een regel. Wanneer de vervangende vlag wordt verstrekt, worden alle exemplaren vervangen., -
INPUTFILE– de naam van het bestand waarop u het commando wilt uitvoeren.
Het is een goede gewoonte om aanhalingstekens rond het argument te plaatsen, zodat de shell meta-karakters niet uitvouwen.
laten we eens kijken hoe we het sed Commando kunnen gebruiken om tekst in bestanden te zoeken en te vervangen door enkele van de meest gebruikte opties en vlaggen.
voor demonstratiedoeleinden gebruiken we het volgende bestand:
123 Foo foo foo foo /bin/bash Ubuntu foobar 456
Als de g vlag wordt weggelaten, wordt alleen het eerste exemplaar van het zoek-string in iedere regel vervangen:
sed -i 's/foo/linux/' file.txt
123 Foo linux foo linux /bin/bash Ubuntu foobar 456
Met de wereldwijde vervanging vlag sed vervangt alle exemplaren van het zoek patroon:
sed -i 's/foo/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu linuxbar 456
Zoals je misschien hebt gemerkt, de substring foo in de foobar string is ook vervangen in het vorige voorbeeld., Als dit niet het gewenste gedrag is, gebruik dan de woordgrensuitdrukking (\b) aan beide uiteinden van de zoekterm. Dit zorgt ervoor dat de gedeeltelijke woorden niet overeenkomen.
sed -i 's/\bfoo\b/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu foobar 456
gebruik de vlag I om de pattern match case ongevoelig te maken., In het voorbeeld hieronder gebruiken we zowel de g en I flags:
sed -i 's/foo/linux/gI' file.txt
123 linux linux linux linux /bin/bash Ubuntu linuxbar 456
Als u een tekenreeks wilt vinden en vervangen die het scheidingsteken bevat (/) u moet de backslash (\) gebruiken om de slash te ontsnappen. Om bijvoorbeeld /bin/bash te vervangen door /usr/bin/zsh zou u
sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt
de gemakkelijkere en veel leesbaardere optie is om een ander scheidingsteken te gebruiken., De meeste mensen gebruiken de verticale balk (|) of dubbele punt (:) maar u kunt elk ander teken gebruiken:
sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt
123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456
u kunt ook reguliere expressies gebruiken. Bijvoorbeeld, om alle 3-cijferige getallen te doorzoeken en te vervangen door de tekenreeks number zou u gebruik maken van:
sed -i 's/\b\{3\}\b/number/g' file.txt
number Foo foo foo foo /bin/bash demo foobar number
een andere handige functie van sed is dat u het ampersand teken & kunt gebruiken die overeenkomt met naar het passende patroon., Het teken kan meerdere keren worden gebruikt.
als u bijvoorbeeld accolades wilt toevoegen {} rond elk 3-cijferig nummer, typ dan:
sed -i 's/\b\{3\}\b/{&}/g' file.txt
{123} Foo foo foo foo /bin/bash demo foobar {456}
Last but not least, is het altijd een goed idee om een back-up te maken bij het bewerken van een bestand met sed. Om dat te doen, geef je gewoon een extensie voor het back-upbestand aan de -i optie., Bijvoorbeeld, voor het bewerken van het file.txt en sla het oorspronkelijke bestand als file.txt.bak gebruik je:
sed -i.bak 's/foo/linux/g' file.txt
om ervoor Te zorgen dat de back-up is gemaakt, wordt een lijst met bestanden met de ls commando:
ls
file.txt file.txt.bak
Recursief Zoeken en Vervangen #
Soms wil je recursief zoeken mappen voor bestanden met een string en het vervangen van de snaar in alle bestanden., Dit kan worden gedaan met commando ‘ s zoals find of grep om recursief bestanden in de map te vinden en de bestandsnamen door te sluizen naar sed.
het volgende commando zal recursief zoeken naar bestanden in de huidige werkmap en de bestandsnamen doorgeven aan sed.,
find . -type f -exec sed -i 's/foo/bar/g' {} +
om problemen te voorkomen met bestanden die ruimte in hun namen bevatten, gebruik de optie -print0, die find vertelt om de bestandsnaam af te drukken, gevolgd door een null-teken en de uitvoer naar sed met xargs -0 :
find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'
om een map uit te sluiten, gebruikt u de optie -not -path.,arting met stip (.), gebruik je:
find . -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'
Als u wilt zoeken en vervangen van tekst alleen bestanden met een bepaalde extensie, gebruikt u:
find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'
een Andere optie is om gebruik te maken van de grep commando om recursief alle bestanden zoeken met de zoek patroon en dan de pijp van de bestandsnamen om sed:
grep -rlZ 'foo' . | xargs -0 sed -i.bak 's/foo/bar/g'
Conclusie #
Hoewel het lijkt misschien ingewikkeld en complex zijn, ten eerste, het zoeken en vervangen van tekst in bestanden met de sed is zeer eenvoudig.,
voor meer informatie over sed commando ‘ s, opties en vlaggen, bezoek de GNU sed handleiding en Grymoire sed tutorial .
Leave a Reply