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 schrijftsed
zijn uitvoer naar de standaard uitgang. Deze optie verteltsed
om 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 leestsed
regel voor Regel het bestand en verandert alleen het eerste voorkomen van deSEARCH_REGEX
op 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