När du arbetar med textfiler måste du ofta hitta och ersätta textsträngar i en eller flera filer.
sed
är en strömredigerare. Det kan utföra grundläggande text manipulation på filer och indataströmmar såsom rörledningar. Med sed
kan du söka, hitta och ersätta, infoga och ta bort ord och rader. Den stöder grundläggande och utökade reguljära uttryck som gör att du kan matcha komplexa mönster.,
i den här artikeln talar vi om hur du hittar och ersätter strängar med sed
. Vi visar dig också hur du utför en rekursiv sökning och ersätter.
hitta och ersätt sträng med sed #
det finns flera versioner avsed
, med vissa funktionella skillnader mellan dem. macOS använder BSD-versionen, medan de flesta Linux-distributioner kommer med GNU sed
förinstallerad som standard. Vi använder GNU-versionen.,
den allmänna formen av att söka och ersätta text med sed
tar följande form:
sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
-
-i
– som standard skriversed
sin utmatning till standardutgången. Det här alternativet talar om försed
att redigera filer på plats. Om en förlängning levereras (ex-i.bak) skapas en säkerhetskopia av den ursprungliga filen. -
s
– ersätt kommandot, förmodligen det mest använda kommandot i sed. -
/ / /
– avgränsare karaktär., Det kan vara vilket tecken som helst, men vanligtvis används slash (/
) – tecknet. -
SEARCH_REGEX
– Normal sträng eller ett reguljärt uttryck att söka efter. -
REPLACEMENT
– ersättningssträngen. -
g
– Global ersätter flaggan. Som standard läsersed
fillinjen för rad och ändrar endast den första förekomsten avSEARCH_REGEX
på en rad. När ersättningsflaggan anges ersätts alla förekomster., -
INPUTFILE
– namnet på filen som du vill köra kommandot på.
det är en bra praxis att lägga citat runt argumentet så att skalmetatecken inte kommer att expandera.
Låt oss se hur vi kan använda kommandotsed
för att söka och ersätta text i filer med några av de vanligaste alternativen och flaggorna.
för demonstrationssyfte använder vi följande fil:
123 Foo foo foo foo /bin/bash Ubuntu foobar 456
om flaggan g
utelämnas, ersätts endast den första instansen av söksträngen i varje rad:
sed -i 's/foo/linux/' file.txt
123 Foo linux foo linux /bin/bash Ubuntu foobar 456
med den globala ersättningsflaggan sed
ersätter alla förekomster av sökmönstret:
sed -i 's/foo/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu linuxbar 456
som du kanske har märkt ersätts substringen foo
inuti strängen foobar
I föregående exempel., Om detta inte är det önskade beteendet, använd uttrycket word-boundary (\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 linuxlinux /bin/bash Ubuntu foobar 456
för att göra mönstermatchningsfallet okänsligt, använd flagganI
., I exemplet nedan använder vi både g
och I
flaggor:
sed -i 's/foo/linux/gI' file.txt
123 linux linux linux linux /bin/bash Ubuntu linuxbar 456
om du vill hitta och ersätta en sträng som innehåller avgränsar tecken (/
) du kan hitta och ersätta måste använda backslash (\
) för att komma undan snedstrecket. Till exempel för att ersätta /bin/bash
med /usr/bin/zsh
skulle du använda
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änsartecken., De flesta använder den vertikala linjen (|
) eller kolon (:
) men du kan använda något 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 reguljära uttryck. Till exempel, för att söka alla tresiffriga nummer och ersätta dem med strängen number
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 i sed är att du kan använda ampersand-tecknet &
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 tresiffrigt 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, ge bara ett tillägg för säkerhetskopian till alternativet -i
., Till exempel, för att redigera file.txt
och spara den ursprungliga filen som file.txt.bak
du skulle använda:
sed -i.bak 's/foo/linux/g' file.txt
för att se till att säkerhetskopian skapas, lista filerna med kommandot ls
:
ls
file.txt file.txt.bak
rekursiv Sök och ersätt #
Ibland kanske du vill rekursivt söka efter kataloger för filer som innehåller en sträng och ersätta strängen i alla filer., Detta kan göras med hjälp av kommandon som find
eller grep
för att rekursivt hitta filer i katalogen och pipa 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änd alternativet-print0
, som sägerfind
för att skriva ut filnamnet, följt av ett null-tecken och rör utmatningen tillsed
medxargs -0
:
find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'
för att utesluta en katalog, använd alternativet-not -path
.,med dot (.
), använd:
find . -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'
om du bara vill söka och ersätta text på filer med ett specifikt tillägg använder du:
find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'
ett annat alternativ är att använda kommandot grep
för att rekursivt hitta alla filer innehåller sökmönstret och rör sedan filnamnen till sed
:
grep -rlZ 'foo' . | xargs -0 sed -i.bak 's/foo/bar/g'
slutsats #
även om det kan tyckas komplicerat och komplext, är det först att söka och ersätta text i filer med sed
mycket enkelt.,
för Att lära dig mer om sed
kommandon, alternativ och flaggor, besök GNU sed manuell och Grymoire sed handledning .
Leave a Reply