Android

Hogyan használhatjuk a sed fájlokat a szövegek megtalálására és cseréjére?

MiVue Pro - jak bezprzewodowo pobierać pliki z wideorejestratora WIFI OTA | ForumWiedzy

MiVue Pro - jak bezprzewodowo pobierać pliki z wideorejestratora WIFI OTA | ForumWiedzy

Tartalomjegyzék:

Anonim

Szövegfájlokkal való munka során gyakran meg kell találnia és cserélnie kell egy vagy több fájlban található szövegrészeket.

sed egy rendszerszintű program. Alapszintű szövegszerkesztést végezhet fájlokon és bemeneti folyamatokon, például csővezetéken. A sed segítségével kereshet, megtalálhat és cserélhet, beszúrhat és törölhet szavakat és sorokat. Támogatja az alap- és a kibővített reguláris kifejezéseket, amelyek lehetővé teszik az összetett minták illesztését.

, arról beszélünk, hogy miként lehet megtalálni és cserélni a húrokat a sed . Azt is megmutatjuk, hogyan végezzünk rekurzív keresést és cserét.

Keresse meg és cserélje ki a sed

A sed több változata létezik, némi funkcionális különbséggel közöttük. A macOS a BSD verziót használja, és a legtöbb Linux disztribúció alapértelmezés szerint előre telepítve van a GNU sed verzióval. A GNU verziót fogjuk használni.

A szöveg keresése és helyettesítése a sed használatával a következő formában alakul ki:

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

  • -i - Alapértelmezés szerint a sed a kimenetet írja a standard kimenetre. Ez az opció azt mondja a sed hogy szerkessze a fájlokat a helyükön. Ha kiterjesztést kapnak (ex -i.bak), akkor az eredeti fájlról biztonsági másolat készül. s - Helyettesítő parancs, valószínűleg a leggyakrabban használt parancs a sed-ben. / / / - Elválasztó karakter. Bármely karakter lehet, de általában a perjel ( / ) karaktert használja. SEARCH_REGEX - Normál karakterlánc vagy reguláris kifejezés, amelyet keresni kell. REPLACEMENT - A csere karakterlánc. g - Globális csere zászló. Alapértelmezés szerint a sed a fájlt soronként olvassa, és csak a sorban a SEARCH_REGEX első megjelenését változtatja meg. A helyettesítő zászló biztosításakor az összes esemény kicserélésre kerül. INPUTFILE - A fájl neve, amelyen futtatni szeretné a parancsot.

Jó gyakorlat, ha idézeteket teszünk az argumentum körül, hogy a héj meta-karakterei ne bontsanak ki.

Lássunk példákat arra, hogyan lehet a sed parancsot használni a fájlokban található szöveg keresésére és cseréjére annak leggyakrabban használt beállításaival és jelöléseivel.

Bemutatási célokra a következő fájlt fogjuk használni:

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

A globális csere jelzővel a sed felváltja a keresési minta minden előfordulását:

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

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

Mint már észrevetted, az előző példában a foobar karakterláncon belüli foobar karakterláncot is kicserélik. Ha ez nem a kívánt viselkedés, akkor használja a keresett karakterlánc mindkét végén a szegélyes kifejezést ( \b ). Ez biztosítja a részleges szavak nem egyezését.

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

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

Használja az I jelzőt, hogy a mintázat illesztése érzéketlen legyen. Az alábbi példában mind a g , mind az I jelzőt használjuk:

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

A könnyebb és sokkal olvashatóbb lehetőség egy másik elválasztó karakter használata. A legtöbb ember függőleges sávot ( | ) vagy kettőspontot (:) használ, de bármilyen más karaktert is használhat:

sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt

123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456

Használhat reguláris kifejezéseket is. Például, hogy keressen mind a három számjegyű számot, és cserélje le azokat a használt karakterláncszámra:

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 az ampersand karaktert & amely megfelel az illesztett mintának. A karakter többször is használható.

Ha például göndör zárójeleket szeretne {} hozzáadni minden háromjegyű szám körül, írja be:

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, hogy biztonsági másolatot készítsen a sed fájllal való szerkesztéskor. Ehhez csak adja meg a -i opció kiterjesztését. Például a file.txt szerkesztéséhez és az eredeti fájl file.txt.bak formátumban történő mentéséhez használja:

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

ls

file.txt file.txt.bak

Rekurzív keresés és csere

Időnként rekurzív módon keresni kell egy karakterláncot tartalmazó fájlok könyvtárait, és minden fájlban ki kell cserélni a karakterláncot. Ezt úgy lehet végrehajtani, mint például a find vagy grep , hogy a fájlokat rekurzív módon keresse meg a könyvtárban, és csatolja a szűrni kívánt fájlneveket.

A következő parancs rekurzív módon keresi a fájlokat az aktuális munkakönyvtárban, és átadja a fájlneveket a sed fájlnak.

find. -type f -exec sed -i 's/foo/bar/g' {} +

A nevekben helyet tartalmazó fájlokkal kapcsolatos problémák elkerülése érdekében használja a -print0 opciót, amely megmondja, hogy a fájl nevét kinyomtatja a null karakterrel, majd írja be a null karaktert, és illessze be a kimenetet az xargs -0 segítségével:

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

A könyvtár kizárásához használja a -not -path beállítást. Például, ha egy karakterláncot cserél a helyi git repo-ban, hogy kizárjon minden pontot ( . ) -Vel kezdődő fájlt, akkor használja:

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'

Egy másik lehetőség a grep parancs használata az összes fájl keresési mintázatot tartalmazó rekurzív megkeresésére, majd a fájlnevek sed :

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

Következtetés

Noha bonyolultnak és bonyolultnak tűnik, kezdetben a fájlokban a szöveg keresése és cseréje sed nagyon egyszerű.

Ha többet szeretne tudni a sed parancsokról, opciókról és zászlókról, látogasson el a GNU sed kézikönyvre és a Grymoire sed bemutatójára. Ha bármilyen kérdése vagy észrevétele van, nyugodtan írjon megjegyzést.

sed terminál