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ísedpíše svůj výstup na standardní výstup. Tato volba řeknesedpro ú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ísednačítá soubor řádek po řádku a změní pouze první výskytSEARCH_REGEXna řá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