Android

Hur man använder sed för att hitta och ersätta sträng i filer

New Witness in Michael Jackson Allegations: Square One MJ Documentary | AVAILABLE ON PRIME VIDEO

New Witness in Michael Jackson Allegations: Square One MJ Documentary | AVAILABLE ON PRIME VIDEO

Innehållsförteckning:

Anonim

Ganska ofta när du arbetar med textfiler måste du hitta och ersätta strängar med text i en eller flera filer.

sed är en s tream ed itor. Den kan utföra grundläggande textmanipulering på filer och inmatningsströmmar som rörledningar. Med sed du söka, hitta och ersätta, infoga och ta bort ord och rader. Det stöder grundläggande och utökade regelbundna uttryck som gör att du kan matcha komplexa mönster.

, vi pratar om hur man hittar och ersätter strängar med sed . Vi visar också hur du utför en rekursiv sökning och ersätter.

Hitta och ersätt strängen med sed

Det finns flera versioner av sed , med några funktionella skillnader mellan dem. macOS använder BSD-versionen och de flesta Linux-distributioner kommer med GNU sed förinstallerat som standard. Vi kommer att använda GNU-versionen.

Den allmänna formen för att söka och ersätta text med sed använder följande form:

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

  • -i - sed skriver som standard sin utgång till standardutgången. Det här alternativet säger sed att redigera filer på plats. Om en tillägg tillhandahålls (ex -i.bak) skapas en säkerhetskopia av den ursprungliga filen. s - Ersättarkommandot, förmodligen det mest använda kommandot i sed. / / / - Avgränsar karaktär. Det kan vara valfritt tecken men vanligtvis används teckningen snedstreck ( / ). SEARCH_REGEX - Normal sträng eller ett vanligt uttryck att söka efter. REPLACEMENT - Ersättningssträngen. g - Global ersättningsflagg. Som standard läser sed filen rad för rad och ändrar bara den första förekomsten av SEARCH_REGEX på en rad. När ersättningsflaggan tillhandahålls kommer alla händelser att ersättas. INPUTFILE - Namnet på filen som du vill köra kommandot på.

Det är bra att sätta citat runt argumentet så att metatecken för skalet inte kommer att expandera.

Låt oss se exempel på hur du använder sed kommandot för att söka och ersätta text i filer med några av dess mest använda alternativ och flaggor.

För demonstrationsändamål kommer vi att använda följande fil:

fil.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

Med den globala ersättningsflaggen ersätter sed alla förekomster av sökmönstret:

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

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

Som du kanske har lagt märke till ersätts också i föregående exempel substansen foo inuti foobar . Om detta inte är det önskade beteendet, använd ordgränsuttrycket ( \b ) i båda ändarna av söksträngen. Detta säkerställer att de partiella orden inte matchas.

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

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

Använd I flaggan för att göra mönstermatchningen känslig. I exemplet nedan använder vi både g och I flaggorna:

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

Det enklare och mycket mer läsbara alternativet är att använda ett annat avgränsande tecken. De flesta använder den vertikala stapeln ( | ) eller kolon (:) men du kan använda valfritt annat tecken:

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

123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456

Du kan också använda vanliga uttryck. Till exempel för att söka i alla 3-siffriga siffror och ersätta dem med strängnumret du skulle använda:

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

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

En annan användbar funktion hos sed är att du kan använda karaktäret ampersand & som motsvarar det matchade mönstret. Tecknet kan användas flera gånger.

Om du till exempel vill lägga till lockiga hängslen {} runt varje 3-siffriga nummer skriver du:

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

{123} Foo foo foo foo /bin/bash demo foobar {456}

Sist men inte minst är det alltid en bra idé att göra en säkerhetskopia när du redigerar en fil med sed . För att göra det bara ge en förlängning till -i alternativet. Till exempel, för att redigera file.txt och spara originalfilen som file.txt.bak skulle du använda:

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

ls

file.txt file.txt.bak

Rekursiv Hitta och ersätt

Ibland vill du rekursivt söka i kataloger efter filer som innehåller en sträng och ersätta strängen i alla filer. Detta kan göras genom att använda kommandon som find eller grep att rekursivt hitta filer i katalogen och leda filnamnen till sed .

Följande kommando söker rekursivt efter filer i den aktuella arbetskatalogen och skickar filnamnen till sed .

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

För att undvika problem med filer som innehåller utrymme i deras namn använder -print0 alternativet -print0 som säger find att skriva ut filnamnet följt av ett nolltecken och leda utdata till sed med xargs -0 :

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

För att utesluta en katalog använder -not -path alternativet -not -path . Om du till exempel byter ut en sträng i din lokala git-repo för att utesluta alla filer som börjar med punkt ( . ), Använd:

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'

Ett annat alternativ är att använda grep kommandot för att rekursivt hitta alla filer som innehåller sökmönstret och sedan rör filnamn till sed :

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

Slutsats

Även om det kan verka komplicerat och komplicerat är det i början mycket enkelt att söka och ersätta text i filer med sed .

För att lära dig mer om sed kommandon, tillval och flaggor besöker du GNU sed-manualen och Grymoire sed-handledning. Om du har några frågor eller feedback kan du lämna en kommentar.

sed terminal