Android

Hoe sed te gebruiken om een ​​string in bestanden te vinden en te vervangen

Excel voorbeeld L-Dataverwerking basic steps

Excel voorbeeld L-Dataverwerking basic steps

Inhoudsopgave:

Anonim

Heel vaak moet u bij het werken met tekstbestanden tekstreeksen in een of meer bestanden zoeken en vervangen.

sed is een bekend persoon. Het kan eenvoudige tekstmanipulatie uitvoeren op bestanden en invoerstromen zoals pijpleidingen. Met sed kunt u woorden en lijnen zoeken, vinden en vervangen, invoegen en verwijderen. Het ondersteunt eenvoudige en uitgebreide reguliere expressies waarmee u complexe patronen kunt matchen.

, zullen we het hebben over het vinden en vervangen van tekenreeksen door sed . We laten u ook zien hoe u een recursieve zoekopdracht uitvoert en vervangt.

String zoeken en vervangen door sed

Er zijn verschillende versies van sed , met enkele functionele verschillen daartussen. macOS gebruikt de BSD-versie en de meeste Linux-distributies worden standaard geleverd met GNU sed . We zullen de GNU-versie gebruiken.

De algemene vorm van zoeken en vervangen van tekst met behulp van sed neemt de volgende vorm aan:

sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE

  • -i - Standaard schrijft sed zijn uitvoer naar de standaarduitvoer. Deze optie vertelt sed om bestanden op hun plaats te bewerken. Als een extensie wordt geleverd (ex -i.bak), wordt een back-up van het oorspronkelijke bestand gemaakt. s - Het vervangende commando, waarschijnlijk het meest gebruikte commando in sed. / / / - Scheidingsteken. Het kan elk willekeurig teken zijn, maar meestal wordt het schuine streepje ( / ) gebruikt. SEARCH_REGEX - Normale tekenreeks of een reguliere expressie om naar te zoeken. REPLACEMENT - De vervangende string. g - Wereldwijde vervangingsvlag. sed leest standaard het bestand regel voor regel en wijzigt alleen de eerste keer dat SEARCH_REGEX op een regel SEARCH_REGEX . Wanneer de vervangende vlag wordt verstrekt, worden alle gebeurtenissen vervangen. INPUTFILE - De naam van het bestand waarop u de opdracht wilt uitvoeren.

Het is een goede gewoonte om aanhalingstekens rond het argument te plaatsen, zodat de shell-metatekens niet worden uitgebreid.

Laten we voorbeelden bekijken van het gebruik van de opdracht sed om tekst in bestanden te zoeken en te vervangen door enkele van de meest gebruikte opties en vlaggen.

Voor demonstratiedoeleinden zullen we het volgende bestand gebruiken:

file.txt

123 Foo foo foo foo /bin/bash Ubuntu foobar 456

sed -i 's/foo/linux/' file.txt

123 Foo linux foo linux /bin/bash Ubuntu foobar 456

Met de globale vervangingsvlag vervangt sed alle gevallen van het zoekpatroon:

sed -i 's/foo/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu linuxbar 456

Zoals je misschien hebt gemerkt, is in het vorige voorbeeld ook de substring foo in de foobar reeks vervangen. Als dit niet het gewenste gedrag is, gebruikt u de uitdrukking woordgrens ( \b ) aan beide uiteinden van de zoekreeks. Dit zorgt ervoor dat de gedeeltelijke woorden niet overeenkomen.

sed -i 's/\bfoo\b/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu foobar 456

Gebruik de vlag I om het patroon-hoofdlettergevoelig te maken. In het onderstaande voorbeeld gebruiken we zowel de vlaggen g als I :

sed -i 's/foo/linux/gI' file.txt

123 linux linux linux linux /bin/bash Ubuntu linuxbar 456

sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt

De gemakkelijker 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. Om bijvoorbeeld alle 3-cijferige nummers te zoeken en te vervangen door het stringnummer number u zou gebruiken:

sed -i 's/\b\{3}\b/number/g' file.txt

number Foo foo foo foo /bin/bash demo foobar number

Een ander handig kenmerk van sed is dat je het ampersand-teken & kunt gebruiken dat overeenkomt met het overeenkomende patroon. Het karakter kan meerdere keren worden gebruikt.

Als u bijvoorbeeld accolades {} rond elk 3-cijferig nummer wilt toevoegen, typt u:

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, biedt u gewoon een uitbreiding van de optie -i . Als u bijvoorbeeld file.txt wilt bewerken en het oorspronkelijke bestand wilt opslaan als file.txt.bak u:

sed -i.bak 's/foo/linux/g' file.txt

ls

file.txt file.txt.bak

Recursief zoeken en vervangen

Soms wilt u mappen recursief zoeken naar bestanden die een string bevatten en de string in alle bestanden vervangen. Dit kan worden gedaan door commando's zoals find of grep om recursief bestanden in de map te vinden en de bestandsnamen naar sed .

De volgende opdracht zoekt recursief naar bestanden in de huidige werkmap en geeft de bestandsnamen door aan sed .

find. -type f -exec sed -i 's/foo/bar/g' {} +

Om problemen met bestanden die ruimte in hun naam bevatten te voorkomen, gebruikt u de optie -print0 die vertelt find om de bestandsnaam af te drukken, gevolgd door een null-teken en de uitvoer naar sed xargs -0 met xargs -0 :

find. -type f -print0 | xargs -0 sed -i 's/foo/bar/g'

Gebruik de optie -not -path om een ​​map uit te sluiten. Als je bijvoorbeeld een string in je lokale git repo vervangt om alle bestanden uit te sluiten die beginnen met punt ( . ), Gebruik dan:

find. -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'

find. -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'

Een andere optie is om de opdracht grep gebruiken om recursief alle bestanden te vinden die het zoekpatroon bevatten en vervolgens de bestandsnamen naar sed te sed :

grep -rlZ 'foo'. | xargs -0 sed -i.bak 's/foo/bar/g'

Conclusie

Hoewel het misschien ingewikkeld en complex lijkt, is het zoeken en vervangen van tekst in bestanden door sed in het begin heel eenvoudig.

Voor meer informatie over sed commando's, opties en vlaggen gaat u naar de GNU sed-handleiding en de Grymoire sed-tutorial. Als u vragen of feedback heeft, kunt u een reactie achterlaten.

sed terminal