fájlok Karakterláncainak megtalálásához és cseréjéhez szövegfájlok használatakor gyakran meg kell találnia és ki kell cserélnie egy vagy több fájl szövegsorát.
sed
egy stream szerkesztő. Képes elvégezni az alapvető szöveg manipuláció fájlok és bemeneti adatfolyamok, mint a csővezetékek. Ased
segítségével kereshet, kereshet és cserélhet, beszúrhat és törölhet szavakat és sorokat. Támogatja az alapvető és kiterjesztett reguláris kifejezéseket, amelyek lehetővé teszik, hogy megfeleljen az összetett mintáknak.,
ebben a cikkben arról beszélünk, hogyan lehet megtalálni és helyettesíteni a karakterláncokat sed
. Megmutatjuk, hogyan kell rekurzív keresést végezni, majd kicserélni.
keresse meg és cserélje le a karakterláncot sed #
a sed
több változata létezik, köztük néhány funkcionális különbség. a macOS a BSD verziót használja, míg a legtöbb Linux disztribúció GNU sed
alapértelmezés szerint előre telepítve van. A GNU verziót fogjuk használni.,
a szöveg keresésének és cseréjének általános formája a sed
a következő formában történik:
sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
-
-i
– alapértelmezés szerintsed
a kimenetet a szabványos kimenetre írja. Ez az opció azt mondjased
szerkeszteni a fájlokat a helyén. Ha mellékelve van egy kiterjesztés (ex-i.bak), akkor létrejön az eredeti fájl biztonsági mentése. -
s
– a helyettesítő parancs, valószínűleg a sed leggyakrabban használt parancsa. -
/ / /
– határoló karakter., Bármilyen karakter lehet, de általában a slash (/
) karaktert használják. -
SEARCH_REGEX
– normál karakterlánc vagy reguláris kifejezés a kereséshez. -
REPLACEMENT
– a helyettesítő karakterlánc. -
g
– globális csere zászló. Alapértelmezés szerint ased
soronként olvassa a fájlsort, és csak aSEARCH_REGEX
első előfordulását változtatja meg egy sorban. Ha a csere zászló van megadva, minden előfordulás helyébe., -
INPUTFILE
– annak a fájlnak a neve, amelyen a parancsot futtatni szeretné.
Ez egy jó gyakorlat, hogy Idézetek körül az érv, így a shell meta-karakterek nem bővül.
lássuk, hogyan tudjuk használni a sed
parancsot a fájlok szövegének kereséséhez és cseréjéhez a leggyakrabban használt opciókkal és zászlókkal.
demonstrációs célokra a következő fájlt fogjuk használni:
123 Foo foo foo foo /bin/bash Ubuntu foobar 456
Ha a g
zászló elhagyásra kerül, csak a keresési karakterlánc első példánya kerül minden sorban:
sed -i 's/foo/linux/' file.txt
123 Foo linux foo linux /bin/bash Ubuntu foobar 456
a globális helyettesítő zászlóval sed
helyettesíti a keresési minta összes előfordulását:
sed -i 's/foo/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu linuxbar 456
ahogy észrevetted, a foo
a foobar
karakterláncot szintén felváltja az előző példa., Ha ez nem a kívánt viselkedés, használja a Word-boundary kifejezést (\b
) a keresési karakterlánc mindkét végén. Ez biztosítja, hogy a részleges szavak ne illeszkedjenek egymáshoz.
sed -i 's/\bfoo\b/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu foobar 456
a mintaméret érzéketlenné tételéhez használja a I
zászlót., A példában használjuk mind a g
vagy I
zászlók:
sed -i 's/foo/linux/gI' file.txt
123 linux linux linux linux /bin/bash Ubuntu linuxbar 456
Ha meg akarod találni, majd cserélje ki egy string, amely az elválasztó karakter (/
) akkor kell használni a backslash (\
), hogy elkerülje a perjel. Például a /bin/bash
/usr/bin/zsh
a könnyebb és olvashatóbb opció egy másik delimiter karakter használata., A legtöbb ember a függőleges sávot (|
) vagy a kettőspontot (:
) használja, de bármilyen más karaktert is használhat:
sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt
reguláris kifejezéseket is használhat. Például az összes 3 számjegyű szám kereséséhez, majd a number
karakterláncra történő helyettesítéséhez a következőket kell használni:
sed -i 's/\b\{3\}\b/number/g' file.txt
number Foo foo foo foo /bin/bash demo foobar number
A sed másik hasznos tulajdonsága, hogy használhatja a amely megfelel az illesztett mintának., A karakter többször is használható.
például, ha göndör zárójeleket szeretne hozzáadni {}
minden 3 számjegyű szám körül, típus:
sed -i 's/\b\{3\}\b/{&}/g' file.txt
{123} Foo foo foo foo /bin/bash demo foobar {456}
végül, de nem utolsósorban, mindig jó ötlet biztonsági másolatot készíteni egy . Ehhez csak adjon meg egy kiterjesztést a biztonsági mentési fájlhoz a -i
opcióhoz., Például szerkeszteni a file.txt
megmenteni az eredeti fájlt, mint a file.txt.bak
használni:
sed -i.bak 's/foo/linux/g' file.txt
ahhoz, Hogy győződjön meg arról, hogy a biztonsági másolat jön létre, a lista a fájlok a ls
parancsot:
ls
file.txt file.txt.bak
Rekurzív Találjuk and Replace #
Néha talán rekurzívan keresés a könyvtárak a fájlok, amelyek egy string, majd cserélje ki a string-ben az összes fájlt., Ezt olyan parancsokkal lehet megtenni, mint például a find
vagy grep
, hogy rekurzív módon megtalálja a fájlokat a könyvtárban, és a fájlneveket sed
– re továbbítja.
a következő parancs rekurzív módon keresi a fájlokat az aktuális munkakönyvtárban, majd átadja a fájlneveket a sed
– nak.,
find . -type f -exec sed -i 's/foo/bar/g' {} +
a nevükben helyet tartalmazó fájlokkal kapcsolatos problémák elkerülése érdekében használja a -print0
opciót, amely a find
fájlnév kinyomtatásához, majd egy null karakter és pipe a kimenet sed
div>xargs -0
:
find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'
egy könyvtár kizárásához használja a -not -path
opciót.,arting dot (.
), használni:
find . -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'
Ha szeretne keresni, majd cserélje ki a szöveget, csak a fájlok egy specifikus kiterjesztés, akkor használja:
find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'
egy Másik lehetőség az, hogy a grep
parancs, hogy rekurzívan találni az összes fájlt, amely a keresési mintát, majd a cső, hogy a fájlnevek, hogy a sed
:
grep -rlZ 'foo' . | xargs -0 sed -i.bak 's/foo/bar/g'
Következtetés #
Bár úgy tűnhet, hogy bonyolult, komplex, először a keresést, illetve cseréje szöveg fájlok sed
nagyon egyszerű.,
Ha többet szeretne megtudni a sed
parancsokról, opciókról és zászlókról, keresse fel a GNU sed kézikönyvet és a Grymoire sed oktatóanyagot .
Leave a Reply