A sed parancs a stream editor (folyamatszerkesztő) rövidítése. Ez egy rendkívül népszerű eszköz Linux/UNIX rendszereken. A Sed önmagában nem egy szövegszerkesztő. Azonban különféle módosításokat képes végrehajtani egy adott szöveg manipulálására. A bemeneti szöveg folyamként (stream) érkezik. A Sed ezután végrehajtja a megadott műveleteket a folyamon. Ez az útmutató áttekintést nyújt a sed parancsról és annak használatáról, hogy sikeresen manipulálhassunk szövegeket Linux alatt.
Sed Linux alatt
A sed bemeneti folyama származhat szöveges fájlból vagy az STDIN-ről (standard bemenet). Dolgozhatunk egy másik parancs kimenetével, vagy közvetlenül egy szöveges fájllal is. A sed eszköz előre telepítve van minden Linux disztribúción.
A Sed használatának áttekintése
A sed parancs a következő struktúrát követi:
|
1 |
$ sed <options> <commands> <file> |
Szemléltetés céljából letöltöttük a GPL licenc 3-as verziójának szöveges változatát:
|
1 |
$ wget https://www.gnu.org/licenses/gpl-3.0.txt |
A következő sed parancs kiírja a szöveges fájl tartalmát:
|
1 |
$ sed '' gpl-3.0.txt |
Itt a sed az egyszeres idézőjelek között leírt műveleteket hajtja végre, és kiírja a kimenetet. Mivel nincs opció megadva, a sed egyszerűen egy üres műveletet hajt végre, és kiírja a fájl teljes tartalmát.
A Sed egy másik parancs kimenetét is elfogadja bemeneti folyamként. A következő példában irányítsuk át (pipe) a GPL v3 szöveges fájl tartalmát a sed parancsnak egy üres művelet végrehajtásához:
|
1 |
$ cat gpl-3.0.txt | sed '' |
Sorok kiíratása
Ha nem adunk meg semmilyen opciót, a sed közvetlenül kiírja a fájl teljes tartalmát. Ehelyett kifejezetten elküldhetjük a print parancsot, hogy az eredményeket közvetlenül a standard kimenetre (STDOUT) írja.
A kimenet kiíratásához használja a p:
|
1 |
$ sed 'p' gpl-3.0.txt |
Alapértelmezés szerint a sed kiírja a kimenetet a képernyőre. Mivel kifejezetten a print parancsot használtuk, a sed minden sort kétszer fog kiírni. A Sed soronként működik. Beolvas egy sort, végrehajtja a meghatározott műveleteket, kiírja azt, majd továbblép a következő sorra.
Mint látható, minden sor kétszer kerül kiírásra. Ha az eredmény így zavaró, megtisztíthatjuk a -n opció használatával. Ez elnyomja az automatikus kiíratási funkciót. Mivel mi küldjük a print parancsot, nincs szükségünk az alapértelmezett kimenet-kiíratási funkció engedélyezésére:
|
1 |
$ sed -n 'p' gpl-3.0.txt |
Regex karakterosztályok
A reguláris kifejezésekben különféle karakterosztályok léteznek. Ezen osztályok mindegyikének van egy tartománya. Sok osztály több kifejezéssel is rendelkezik. A legtöbb osztály karaktertartomány:
-
- [a-z]: Kisbetűs karakter
-
- [A-Z]: Nagybetűs karakter
-
- [0-9]: Számjegyek
-
- [a-zA-z]: Betűk
-
- [a-zA-z0-9]: Bármilyen alfanumerikus karakter
Ezeknek a karakterosztályoknak különböző jelöléseik is vannak:
-
- [:lower:]: Kisbetűs karakter
-
- [:upper:]: Nagybetűs karakter
-
- [:digit:]: Számjegyek
-
- [:alpha:]: Betűk
-
- [:alphanum:]: Alfanumerikus karakter
Például a következő parancs kiírja az összes olyan sort, amely legalább egy számjegyet tartalmaz:
|
1 |
$ sed -n 's/[[:digit:]]/&/p' gpl-3.0.txt |
Címtartományok
Meghatározhatjuk a szövegfolyam azon konkrét részét, amellyel dolgozni szeretnénk. Ez lehet egy sor statikus helye vagy egy sortartomány. Az első példában a GPL v3 szöveges fájl 5. sorát fogjuk kiírni:
|
1 |
$ sed -n '5p' gpl-3.0.txt |
Egyetlen sor helyett megadhatunk egy sortartományt is, amellyel dolgozni szeretnénk. Itt az 5. sortól a 9. sorig terjedő címtartományt adtuk meg (összesen 5 sor), amelyen a sed dolgozni fog:
|
1 |
$ sed -n '5,9p' gpl-3.0.txt |
A sorcím megadásának más módjai is vannak. Ahelyett, hogy magunk határoznánk meg a sorszámokat, átalakíthatjuk az előző példát úgy, hogy a sed az 5. sortól kezdjen, és a következő 5 soron végezzen műveletet:
|
1 |
$ sed -n '5,+5p' gpl-3.0.txt |
A sorok megadásának másik módja az intervallumok használata. A következő példában a sed az 1. sortól kezdve minden második soron fog műveletet végezni:
|
1 |
$ sed -n '1~2p' gpl-3.0.txt |
Szöveg törlése
Eddig a célszöveg sorainak kiíratásán dolgoztunk. A kiíratás helyett el is távolíthatjuk a sorokat a kimenetből. A következő példában több sort fogunk eltávolítani a kezdetétől. Itt nem szükséges a -n opciót használnunk, mert azt szeretnénk, hogy a sed minden mást kiírjon, ami nincs törölve. A sorok törléséhez a d:
|
1 |
$ sed '1~2d' gpl-3.0.txt |
Vegye figyelembe, hogy a forrásfájl továbbra is érintetlen. Sed csak a sorok törlését végzi el a kimenet során. Ha szeretné, elmentheti a sed kimenetét egy fájlba. Felülírhatja az eredeti fájlt, vagy elmentheti egy másik néven:
|
1 |
$ sed '1~2d' gpl-3.0.txt > gpl-3.0.modified.txt |
Ahelyett, hogy manuálisan írná a kimenetet egy fájlba, a sed képes helyben szerkeszteni az eredeti fájlt. Röviden, a sed szerkeszteni fogja az eredeti fájlt, és beírja a végrehajtott változtatásokat. Ez a módszer felülírja az eredeti fájlt, ezért óvatosan kell használni:
|
1 |
$ sed -i '1~2d' gpl-3.0.txt |
Mivel a helyben történő szerkesztés veszélyes, a sed rendelkezik biztonsági mentési funkcióval. Helyben történő szerkesztéskor használja a -i.bak opciót a -i helyett, hogy szerkesztés előtt biztonsági mentést készítsen. A Sed a biztonsági mentési fájlt .bak kiterjesztéssel fogja létrehozni:
|
1 |
$ sed -i.bak '1~2d' gpl-3.0.txt |
Szöveghelyettesítés
Ez messze az egyik leggyakoribb alkalmazása a sed-nek. Egy szövegmintát keres, és lecseréli azt egy megadott szövegre. Itt a szövegminta reguláris kifejezésekkel (röviden regex) van leírva. Ha többet szeretne megtudni a regex használatáról, kövesse ezt az útmutatót, amely bemutatja, hogyan lehet a Grep-et reguláris kifejezésekkel használni szövegminták keresésére fájlokban.
Íme egy példa a legegyszerűbb, reguláris kifejezést használó szöveghelyettesítésre:
|
1 |
$ 's/<search_pattern>/<replacement>' |
Itt az s a helyettesítés parancsa. A perjelek a minta és a helyettesítő szöveg elválasztói. Lássuk működés közben:
|
1 |
$ echo "hello world" | sed 's/hello/HELLO/' |
A következő példa az aláhúzásjel (_) használatát mutatja be. Itt az aláhúzásjelek fognak elválasztóként szolgálni:
|
1 |
$ echo http://example.com/index.html | sed 's_com/index_net/home_' |
Itt a com/index mintát keressük, hogy lecseréljük a net/home. mintára. Ügyeljen az aláhúzásjelek elhelyezésére, mert azok rendkívül fontosak. Ha például hiányzik az utolsó aláhúzásjel, a sed hibát fog jelezni:
|
1 |
$ echo "http://www.example.com/index.html" | sed 's_com/index_net/home' |
Szükségünk van egy tesztfájlra a helyettesítés gyakorlásához. Itt a GPL v3 szöveges fájl egy vágott verziója látható:
|
1 |
$ cat gpl-3.0.cropped.txt |
Hajtsunk végre néhány alapvető szöveghelyettesítést:
|
1 |
$ cat gpl-3.0.cropped.txt | sed 's/GNU/GNU is Not Unix/' |
Nézze meg a következő példát. Szeretnénk a the összes előfordulását lecserélni erre: THE :
|
1 |
$ echo "the the quick brown fox jumps over the lazy dog" | sed 's/the/THE/' |
Észrevett valamit? A Sed nem változtatta meg a the. összes előfordulását. Valójában csak az elsőt. Mi történik? Ez az s opció alapértelmezett viselkedése. Csak az adott sor első előfordulására illeszkedik, majd továbblép a következőre. Ahhoz, hogy a sed a teljes sorban keresse a mintát, egy opcionális g jelzőt kell használnunk. Javítsuk ki a parancsot:
|
1 |
$ echo "the the quick brown fox jumps over the lazy dog" | sed 's/the/THE/g' |
Most már a várt módon működik. A parancs használatának egy másik érdekes módja, ha megadjuk a módosítani kívánt előfordulások számát. Az előző példában 3 előfordulása volt a the szónak, igaz? Mi lenne, ha megadnánk, hogy csak a 3. előfordulást módosítsa? A változtatás az opcionális jelzőnél fog történni:
|
1 |
$ echo "the the quick brown fox jumps over the lazy dog" | sed 's/the/THE/3' |
Ha nagy szövegfájllal dolgozik, segíthet, ha sed csak azokat a sorokat írja ki, amelyekben a helyettesítések megtörténtek. Ennek eléréséhez egy további jelzőt kell hozzáadnunk: p:
|
1 |
$ sed -n 's/GNU/GNU is Not Unix/gp' gpl-3.0.txt |
Kis- és nagybetűk megkülönböztetése
Alapértelmezés szerint az összes sed művelet megkülönbözteti a kis- és nagybetűket. A következő parancs bemutatja a kis- és nagybetű-érzékenység alapértelmezett viselkedését:
|
1 |
$ echo "HELLO WORLD" | sed 's/hello/hElLo/' |
A kis- és nagybetűk eltérése miatt nincs változás. Ilyen helyzetben megmondhatjuk a sed parancsnak, hogy hagyja figyelmen kívül a kis- és nagybetűk megkülönböztetését. Ehhez adja hozzá az opcionális i:
|
1 |
$ echo "HELLO WORLD" | sed 's/hello/hElLo/i' |
Hogyan cseréljünk és hivatkozzunk szövegekre
A sed ereje leginkább a reguláris kifejezések használatának képességében rejlik. Fejlettebb és összetettebb regex mintákkal sokkal többet érhetünk el. Például helyettesíthetjük a szöveget a fájl elejétől egy bizonyos helyig. Nézze meg a következő kifejezést:
|
1 |
$ sed 's/^.*GNU/GNU_replaced/' gpl-3.0.txt |
Itt a kalap jel (^) a sor elejét jelöli. Bármely karakterre illeszkedő operátort a pont (.) jelöli. A csillag (*) a helyettesítő kifejezés, amely a sor elejétől a GNU.
karakterláncig illeszkedik. Egy másik érdekes trükk az & szimbólum használata. Ezzel kiemelhetjük azokat a területeket, amelyeket a sed megtalál a keresési minta alapján:
|
1 |
$ sed 's/^.*GNU/(&)/' gpl-3.0.txt |
Záró gondolatok
Ebben az útmutatóban megismertük a sed parancs alapjait. Megtanultuk, hogyan lehet konkrét sorokat kiíratni, szövegeket keresni, törölni és helyettesíteni, szövegeket felülírni és reguláris kifejezéseket használni. Egy megfelelően felépített sed parancs drámaian átalakíthat egy szöveges dokumentumot. Most már sikeresen manipulálhat szövegeket Linux alatt a sed.
segítségével. Kellemes számítógépezést!









Hozzászólások
Még nincsenek hozzászólások. Legyen Ön az első.