Android

Jak pomocí sed najít a nahradit řetězec v souborech

SublimeText + Emmet - 23 buscar y reemplazar @JoseCodFacilito

SublimeText + Emmet - 23 buscar y reemplazar @JoseCodFacilito

Obsah:

Anonim

Poměrně často při práci s textovými soubory budete muset najít a nahradit řetězce textu v jednom nebo více souborech.

sed je tream ed itor. Může provádět základní textovou manipulaci se soubory a vstupními toky, jako jsou potrubí. Pomocí 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í sladit složité vzory.

, budeme mluvit o tom, jak najít a nahradit řetězce sed . Ukážeme vám také, jak provést rekurzivní vyhledávání a nahrazení.

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á verzi BSD a většina linuxových distribucí je standardně předinstalovaná GNU sed . Použijeme verzi GNU.

Obecná forma vyhledávání a nahrazování textu pomocí sed má následující podobu:

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

  • -i - Standardně sed zapisuje svůj výstup na standardní výstup. Tato volba řekne sed aby upravoval soubory na místě. Pokud zadáte příponu (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ělovací znak. Může to být libovolný znak, ale obvykle se používá znak lomítka ( / ). SEARCH_REGEX - Normální řetězec nebo regulární výraz, který se má vyhledat. REPLACEMENT - Náhradní řetězec. g - Globální náhradní příznak. Ve výchozím nastavení sed čte řádek po řádku a mění pouze první výskyt SEARCH_REGEX na řádku. Po zadání příznaku nahrazení budou všechny výskyty nahrazeny. INPUTFILE - Název souboru, na kterém chcete příkaz spustit.

Je dobrým zvykem kolem argumentu uvádět citace, aby se meta-znaky shellu nerozšiřovaly.

Podívejme se na příklady, jak pomocí příkazu sed vyhledávat a nahrazovat text v souborech některými z nejčastěji používaných voleb a příznaků.

Pro demonstrační účely použijeme následující soubor:

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

S příznakem globální nahrazení sed nahrazuje všechny výskyty vzoru vyhledávání:

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

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

Jak jste si možná všimli, v předchozím příkladu se také nahradí podřetězec foo uvnitř řetězce foobar . Pokud to není požadované chování, použijte výraz ohraničení slov ( \b ) na obou koncích vyhledávacího řetězce. Tím je zajištěno, že dílčí slova se neshodují.

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

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

Chcete-li, aby se velikost písmen nerozlišovala, použijte příznak I V níže uvedeném příkladu používáme příznaky g a 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

Nejjednodušší a mnohem čitelnější možností je použití jiného oddělovacího znaku. Většina lidí používá svislý pruh ( | ) nebo dvojtečku (:), ale můžete použít jakýkoli 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 prohledejte všechna 3 číslice a nahraďte je řetězcem, který byste použili:

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

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

Další užitečnou vlastností sed je, že můžete použít znak ampersand & který odpovídá uzavřenému vzoru. Znak lze použít vícekrát.

Pokud například chcete přidat každé složené číslo složené do složených závorek {} , zadejte:

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

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

V neposlední řadě je vždy dobré vytvořit zálohu při úpravě souboru pomocí sed . Stačí jen rozšířit volbu -i . Například pro úpravu file.txt a uložení původního souboru jako file.txt.bak byste použili:

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

ls

file.txt file.txt.bak

Rekurzivní hledání a nahrazování

Někdy chcete rekurzivně hledat adresáře pro soubory obsahující řetězec a nahradit řetězec ve všech souborech. To lze provést pomocí příkazů, jako je find nebo grep k rekurzivnímu nalezení souborů v adresáři a propojení názvů souborů k 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' {} +

Chcete-li se vyhnout problémům se soubory obsahujícími jejich názvy, použijte volbu -print0 která říká find aby se název souboru vytiskl, následovaný nulovým znakem a výstupem do sed pomocí xargs -0 :

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

Chcete-li vyloučit adresář, použijte volbu -not -path . Pokud například nahrazujete řetězec v místním repozitáři git, abyste vyloučili všechny soubory začínající tečkou ( . ), Použijte:

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'

Další možností je použít příkaz grep k rekurzivnímu nalezení všech souborů obsahujících vzorec vyhledávání a pak k sed názvů souborů k sed :

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

Závěr

Ačkoli se to může zdát složité a složité, vyhledávání a nahrazování textu v souborech sed je zpočátku velmi jednoduché.

Chcete-li se dozvědět více o příkazech sed , možnostech a příznakech, navštivte příručku GNU sed a tutoriál Grymoire sed. Pokud máte nějaké dotazy nebo zpětnou vazbu, neváhejte zanechat komentář.

sed terminál