Při práci s textovými soubory, budete často muset najít a nahradit textové řetězce v jednom nebo více souborů.
sed
je editor proudu. Může provádět základní manipulaci s textem na souborech a vstupních tocích, jako jsou potrubí. S sed
můžete vyhledávat, vyhledávat a nahrazovat, vkládat a mazat slova a řádky. Podporuje základní a rozšířené regulární výrazy, které vám umožní přizpůsobit složité vzory.,
v tomto článku budeme hovořit o tom, jak najít a nahradit řetězce sed
. Ukážeme vám také, jak provést rekurzivní vyhledávání a nahradit.
najít a nahradit řetězec sed #
existuje několik verzí sed
, s některými funkčními rozdíly mezi nimi. macOS používá BSD verze, zatímco většina Linuxových distribucí přijít s GNU sed
pre-nainstalovány ve výchozím nastavení. Použijeme verzi GNU.,
obecné podobě hledání a nahrazování textu pomocí sed
má následující podobu:
sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
-
-i
– ve výchozím nastavenísed
píše svůj výstup na standardní výstup. Tato volba řeknesed
pro úpravu souborů na místě. Pokud je dodána přípona (ex-i. bak), vytvoří se záloha původního souboru. -
s
– náhradní příkaz, pravděpodobně nejpoužívanější příkaz v sed. -
/ / /
– oddělovač znaků., Může to být libovolný znak, ale obvykle se používá lomítko (/
). -
SEARCH_REGEX
– normální řetězec nebo regulární výraz pro vyhledávání. -
REPLACEMENT
– náhradní řetězec. -
g
– Global replacement flag. Ve výchozím nastavenísed
načítá soubor řádek po řádku a změní pouze první výskytSEARCH_REGEX
na řádku. Je-li k dispozici náhradní vlajka, všechny výskyty jsou nahrazeny., -
INPUTFILE
– název souboru, na kterém chcete příkaz Spustit.
je to dobrá praxe dát citace kolem argumentu, takže shell meta-znaky nebudou rozšiřovat.
podívejme se, jak můžeme použít příkazsed
k vyhledávání a nahrazování textu v souborech některými jeho nejčastěji používanými možnostmi a vlajkami.
pro demonstrační účely použijeme následující soubor:
123 Foo foo foo foo /bin/bash Ubuntu foobar 456
Pokud g
příznak vynechán, pouze první výskyt hledaného řetězce v každém řádku se nahrazuje:
sed -i 's/foo/linux/' file.txt
123 Foo linux foo linux /bin/bash Ubuntu foobar 456
S globální nahrazení vlajky sed
a nahradí všechny výskyty hledaného vzoru:
sed -i 's/foo/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu linuxbar 456
Jak jste si možná všimli, podřetězec foo
uvnitř foobar
řetězec je také nahrazuje v předchozím příkladu., Pokud toto není hledané chování, použijte výraz hranice slova (\b
) na obou koncích vyhledávacího řetězce. Tím je zajištěno, že částečná slova nejsou shodná.
sed -i 's/\bfoo\b/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu foobar 456
Chcete-li, aby vzor odpovídal velikosti, použijteI
příznak., V níže uvedeném příkladu jsme pomocí obou g
I
příznaky:
sed -i 's/foo/linux/gI' file.txt
123 linux linux linux linux /bin/bash Ubuntu linuxbar 456
Pokud chcete najít a nahradit řetězec, který obsahuje oddělovač znak (/
) musíte použít zpětné lomítko (\
), aby se vyhnuli lomítko. Například nahradit /bin/bash
/usr/bin/zsh
použít
sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt
Je jednodušší a mnohem přehlednější možností je použít jiný oddělovač., Většina lidí používá svislá čára (|
) nebo tlustého střeva (:
), ale můžete použít libovolný jiný znak:
sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt
123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456
můžete také použít regulární výrazy. Například hledat všechny 3 číslice čísla a nahradit je řetězcem number
použití:
sed -i 's/\b\{3\}\b/number/g' file.txt
number Foo foo foo foo /bin/bash demo foobar number
Další užitečné funkce sed je, že můžete použít ampersand znak &
, který odpovídá odpovídající vzor., Znak lze použít vícekrát.
například, pokud chcete přidat složených závorek {}
kolem každé 3 místné číslo, typ:
sed -i 's/\b\{3\}\b/{&}/g' file.txt
{123} Foo foo foo foo /bin/bash demo foobar {456}
v neposlední řadě, je to vždy dobrý nápad, aby se zálohování při úpravě souboru s sed
. Chcete-li to provést, stačí zadat příponu záložního souboru na možnost -i
., Chcete-li například upravit file.txt
a uložte původní soubor jako file.txt.bak
použití:
sed -i.bak 's/foo/linux/g' file.txt
ujistěte Se, že zálohování je vytvořen, seznam souborů s ls
příkaz:
ls
file.txt file.txt.bak
Rekurzivní Najít a Nahradit #
Někdy můžete chtít rekurzivně vyhledávání adresářů pro soubory obsahující řetězec a nahradit řetězec ve všech souborech., To lze provést pomocí příkazů jako find
nebo grep
rekurzivně najít soubory v adresáři a potrubí názvy souborů do sed
.
následující příkaz rekurzivně vyhledá soubory v aktuálním pracovním adresáři a předá názvy souborů sed
.,
find . -type f -exec sed -i 's/foo/bar/g' {} +
Aby se zabránilo problémy s soubory, které obsahují prostor v jejich jmény, používání -print0
možnost, která říká, find
tisk názvu souboru, následuje znak null a potrubí výstup do sed
pomocí xargs -0
:
find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'
vyloučit adresáře, použijte -not -path
možnost.,arting s tečkou (.
), použití:
find . -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'
Pokud chcete vyhledat a nahradit text pouze na soubory s určitou příponou, které budete používat:
find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'
Další možností je použít grep
příkaz rekurzivně najít všechny soubory obsahující hledaný vzorek a pak potrubí názvy souborů do sed
:
grep -rlZ 'foo' . | xargs -0 sed -i.bak 's/foo/bar/g'
Závěr #
i když se to může zdát komplikované a složité, na první pohled, hledání a nahrazování textu v souborech pomocí sed
je velmi jednoduchá.,
Chcete-li se dozvědět více o příkazech, možnostech a vlajkáchsed
, navštivte manuál GNU sed a výukový program Grymoire sed .
Leave a Reply