Biztonság.  Beállít.  Internet.  Felépülés.  Telepítés

Bash sedtől és ig. Speciális sed: szövegfolyamok kezelése Linuxon

Legutóbb a bash szkriptekben lévő függvényekről beszéltünk, különösen arról, hogyan hívhatjuk meg őket a parancssorból. Mai témánk egy nagyon hasznos eszköz a karakterlánc-adatok feldolgozására - egy sed nevű Linux segédprogram. Gyakran használják naplófájlok, konfigurációs és egyéb fájlok formájában lévő szövegek kezelésére.



Ha bármilyen adatkezelést végez a bash szkriptekben, akkor ismernie kell a sed és a gawk eszközöket. Itt a sed-re és a szövegekkel való munkára fogunk összpontosítani, mivel ez egy nagyon fontos lépés a bash szkriptek fejlesztésének hatalmas kiterjedésein keresztüli utazásunk során.

Most megnézzük a sed-vel való munka alapjait, és több mint három tucat példát tekintünk ennek az eszköznek a használatára.

A sed-vel való munka alapjai

A sed segédprogramot streaming szövegszerkesztőnek nevezik. Az olyan interaktív szövegszerkesztőkben, mint a nano, a szövegekkel dolgozhat a billentyűzet használatával, szerkesztheti a fájlokat, szövegeket adhat hozzá, törölhet vagy módosíthat. A Sed lehetővé teszi az adatfolyamok szerkesztését a fejlesztő által meghatározott szabálykészletek alapján. Így néz ki ez a parancs:

$sed beállítási fájl
Alapértelmezés szerint a sed a meghívásakor megadott szabályokat alkalmazza, parancsok halmazaként kifejezve az STDIN-re. Ez lehetővé teszi az adatok közvetlen továbbítását a sed számára.

Például így:

$ echo "Ez egy teszt" | sed "s/teszt/egy másik teszt/"
Ez történik a parancs futtatásakor.


Egy egyszerű példa a sed hívására

Ebben az esetben a sed a „teszt” szót a feldolgozásra átadott sorban az „egy másik teszt” szavakra cseréli. Az idézőjelbe tett szöveg feldolgozására vonatkozó szabály megfogalmazásához perjeleket használnak. Esetünkben olyan parancsot használtunk, mint az s/minta1/minta2/. Az „s” betű a „helyettesítő” szó rövidítése, vagyis van egy helyettesítő parancsunk. A Sed ezt a parancsot végrehajtva átnézi a továbbított szöveget, és a minta1-nek megfelelő töredékeket (a továbbiakban arról lesz szó, hogy melyiket) lecseréli minta2-re.

A fenti egy primitív példa a sed használatára, hogy felgyorsítsa a sebességet. Valójában a sed sokkal összetettebb szövegfeldolgozási forgatókönyvekben használható, például fájlokkal való munka során.

Az alábbiakban egy fájl található, amely egy szövegrészt és a paranccsal végzett feldolgozás eredményeit tartalmazza:

$ sed "s/teszt/egy másik teszt" ./myfile


Szöveges fájl és feldolgozási eredményei

Ez ugyanazt a megközelítést használja, mint fentebb, de most a sed feldolgozza a fájlban tárolt szöveget. Ha azonban a fájl elég nagy, akkor észre fogja venni, hogy a sed az adatokat darabokban dolgozza fel, és a feldolgozott adatokat megjeleníti a képernyőn anélkül, hogy megvárná a teljes fájl feldolgozását.

A Sed nem változtatja meg az általa feldolgozott fájl adatait. A szerkesztő beolvassa a fájlt, feldolgozza az olvasottakat, és a kapott kimenetet elküldi az STDOUT-nak. Annak érdekében, hogy megbizonyosodjon arról, hogy a forrásfájl nem változott, elegendő megnyitni, miután átvitte a sed-re. Ha szükséges, a sed kimenete átirányítható egy fájlba, esetleg felülírva a régi fájlt. Ha ismeri a sorozat egyik korábbi cikkét, amely a bemeneti és kimeneti adatfolyamok átirányításáról szól, akkor ezt megteheti.

Parancskészletek végrehajtása a sed hívásakor

Ha több műveletet szeretne végrehajtani az adatokon, használja a -e kapcsolót a sed hívásakor. Például a következőképpen szervezheti meg két szövegrészlet cseréjét:

$ sed -e "s/Ez/az/; s/teszt/egy másik teszt/" ./myfile


Az -e kapcsoló használata a sed hívásakor

Mindkét parancs a fájl minden sorára vonatkozik. Pontosvesszővel kell elválasztani őket, és nem szabad szóközt hagyni a parancs vége és a pontosvessző között.
Ha több szövegfeldolgozási mintát szeretne megadni a sed hívásakor, az első egyetlen idézőjel beírása után nyomja meg az Enter billentyűt, majd írja be az egyes szabályokat egy új sorba, a záró idézetet sem felejtve el:

$ sed -e " > s/Ez/az/ > s/teszt/egy másik teszt/" ./myfile
Ez történik az ebben a formában bemutatott parancs végrehajtása után.


Egy másik módja a sed-vel való munkavégzésnek

Parancsok olvasása fájlból

Ha sok sed parancsot kell használni a szöveg feldolgozásához, általában a legjobb, ha előre beírja őket egy fájlba. A parancsokat tartalmazó sed fájl megadásához használja a -f kapcsolót:

Íme a mycommands fájl tartalma:

S/Ez/az/s/teszt/egy másik teszt/
Hívjuk a sed-et, átadva a szerkesztőnek egy fájlt parancsokkal és egy feldolgozandó fájlt:

$ sed -f mycommands myfile
Az ilyen parancsok meghívásának eredménye hasonló az előző példákban kapott eredményhez.


Parancsfájl használata a sed hívásakor

Cserélje ki a parancsjelzőket

Nézze meg alaposan a következő példát.

$sed "s/teszt/egy másik teszt/" saját fájl
Ez az, amit a fájl tartalmaz, és amit a sed feldolgozása után kap meg.


Forrásfájl és feldolgozásának eredménye

A csere parancs általában többsoros fájlt kezel, de az egyes sorokban csak a keresett szöveg első előfordulásai kerülnek lecserélésre. A minta összes előfordulásának lecseréléséhez a megfelelő jelzőt kell használnia.

A csereparancs írásának sémája zászlók használatakor így néz ki:

S/minta/csere/zászlók
Ennek a parancsnak a végrehajtása többféleképpen módosítható.

  • A szám továbbításakor a minta karakterláncban való előfordulásának sorszámát veszik figyelembe, és ez az előfordulás kerül pótlásra.
  • A g zászló azt jelzi, hogy a minta minden előfordulását fel kell dolgozni a karakterláncban.
  • A p zászló azt jelzi, hogy az eredeti karakterlánc tartalmát ki kell nyomtatni.
  • A w fájl jelző utasítja a parancsot, hogy a szövegfeldolgozás eredményeit fájlba írja.
Fontolja meg a helyettesítő parancs első verziójának használatát, jelezve a szükséges töredék lecserélt előfordulásának helyét:

$ sed "s/teszt/egy másik teszt/2" myfile

A helyettesítő parancs meghívása, amely jelzi a cserélendő töredék helyzetét

Itt a 2-es számot adtuk meg helyettesítő jelzőként, ami oda vezetett, hogy minden sorban csak a kívánt minta második előfordulása került cserére. Most próbáljuk meg a globális helyettesítő jelzőt - g:

$ sed "s/teszt/egy másik teszt/g" myfile
Amint az a kimeneti eredményekből látható, egy ilyen parancs a minta minden előfordulását helyettesítette a szövegben.


Globális csere

A helyettesítő parancs p jelzője lehetővé teszi olyan sorok kinyomtatását, ahol egyezés található, míg a sed hívásakor megadott -n opció elnyomja a normál kimenetet:

$ sed -n "s/teszt/egy másik teszt/p" saját fájl
Ennek eredményeként, amikor a sed ebben a konfigurációban elindul, csak azok a sorok (esetünkben egy sor) jelennek meg, amelyekben a megadott szövegrészlet megtalálható.


A csere parancs jelzőjének használata p

Használjuk a w jelzőt, amellyel a szövegfeldolgozás eredményeit fájlba menthetjük:

$ sed "s/teszt/egy másik teszt/w kimenet" myfile


Szövegfeldolgozási eredmények mentése fájlba

Jól látható, hogy a parancs működése során az adatok az STDOUT-ba kerülnek, míg a feldolgozott sorok egy fájlba íródnak, melynek neve w után van feltüntetve.

Elválasztó karakterek

Képzelje el, hogy az /etc/passwd fájlban a /bin/bash helyére cseréli a /bin/csh-t. A feladat nem olyan nehéz:

$ sed "s/\/bin\/bash/\/bin\/csh/" /etc/passwd
Ez azonban nem néz ki túl jól. A helyzet az, hogy mivel a perjeleket határoló karakterként használjuk, a sed-nek átadott karakterláncokban ugyanazokat a karaktereket kell kihagyni. Ennek eredményeként a parancs olvashatósága romlik.

Szerencsére a sed lehetővé teszi, hogy meghatározzuk saját határoló karaktereinket, amelyeket a csere parancsban használunk. Az elválasztó az s után megjelenő első karakter:

$ sed "s!/bin/bash!/bin/csh!" /etc/passwd
Ebben az esetben egy felkiáltójelet használunk elválasztóként, ennek eredményeként a kód könnyebben olvasható, és sokkal tisztábbnak tűnik, mint korábban.

Szövegtöredékek kiválasztása feldolgozásra

Eddig a sed-et hívtuk a szerkesztőnek átadott teljes adatfolyam feldolgozására. Bizonyos esetekben a sed használatával csak a szöveg egy részét kell feldolgoznia - egy adott sort vagy sorcsoportot. E cél elérése érdekében két megközelítést alkalmazhat:
  • Állítson be korlátot a feldolgozandó sorok számára.
  • Adja meg azt a szűrőt, amelynek megfelelő sorait fel kell dolgozni.
Tekintsük az első megközelítést. Itt két lehetőség van. Az első, amelyet alább tárgyalunk, magában foglalja a feldolgozandó sor számának megadását:

$sed "2s/teszt/egy másik teszt/" saját fájl


Csak egy vonal feldolgozása, a sed hívásakor megadott szám

A második lehetőség egy sor karakterlánc:

$ sed "2.3s/test/anther test/" myfile


Sorok tartományának feldolgozása

Ezenkívül meghívhatja a csere parancsot, hogy a fájl egy bizonyos sortól a végéig kerüljön feldolgozásra:

$ sed "2,$s/teszt/egyéb teszt/" myfile


A fájl feldolgozása a második sortól a végéig

Ahhoz, hogy a csere parancsot csak az adott szűrőnek megfelelő sorok feldolgozására használjuk, a parancsot a következőképpen kell meghívni:

$ sed "/likegeeks/s/bash/csh/" /etc/passwd
A fentiekkel analóg módon a sablon az s parancsnév előtt kerül átadásra.


A szűrőnek megfelelő sorok feldolgozása

Itt egy nagyon egyszerű szűrőt használtunk. Ennek a megközelítésnek a lehetőségeinek teljes kiaknázásához használhat reguláris kifejezéseket. A sorozat következő anyagainak egyikében fogunk róluk beszélni.

Sorok eltávolítása

A sed segédprogram nem csak a karakterláncok egyik karaktersorozatának másikkal való helyettesítésére használható. Segítségével, nevezetesen a d paranccsal törölhet sorokat egy szövegfolyamból.

A parancshívás így néz ki:

$sed "3d" myfile
A harmadik sort szeretnénk eltávolítani a szövegből. Kérjük, vegye figyelembe, hogy ez nem fájl. A fájl változatlan marad, a törlés csak a sed által generált kimenetet érinti.


A harmadik sor eltávolítása

Ha a d parancs meghívásakor nem adja meg a törölni kívánt sor számát, a folyam összes sora törlődik.

A következőképpen alkalmazhatja a d parancsot számos karakterláncra:

$sed "2,3d" myfile


Sorok tartományának törlése

A következőképpen törölheti a sorokat az adott sortól kezdve a fájl végéig:

$sed "3,$d" saját fájl


Sorok törlése a fájl végéig

A sorok a következő mintával is törölhetők:

$ sed "/test/d" saját fájl


Sorok eltávolítása mintával

A d hívásakor megadhat egy pár mintát - a sorok, amelyekben a minta előfordul, és a közöttük lévő sorok törlődnek:

$ sed "/second/,/fourth/d" myfile


Sorok tartományának eltávolítása helyettesítő karakterekkel

Szöveg beszúrása egy adatfolyamba

A sed segítségével adatokat szúrhat be egy szövegfolyamba az i és a parancsok használatával:
  • Az i parancs egy új sort ad a megadott elé.
  • Az a parancs egy új sort ad a megadott után.
Nézzünk egy példát az i parancs használatára:

$ echo "Másik teszt" | sed "i\First teszt"


Csapat i

Most nézzük az a parancsot:

$ echo "Másik teszt" | sed "a\First teszt"


Parancs a

Amint láthatja, ezek a parancsok szöveget adnak az adatfolyamból származó adatok elé vagy után. Mi van, ha hozzá kell adni egy sort valahol a közepén?

Itt a segítségünkre lesz a folyamban, vagy sablonban található hivatkozási sor számának feltüntetése. Kérjük, vegye figyelembe, hogy a karakterláncok tartományként történő címzése itt nem működik. Hívja az i parancsot, jelezve a sor számát, amely előtt új sort kell beszúrnia:

$ sed "2i\Ez a beillesztett sor." saját fájl


Parancs i hivatkozási sorszámmal

Tegyük ugyanezt az a paranccsal:

$ sed "2a\Ez a hozzáfűzött sor." saját fájl


Parancs a hivatkozási sorszámmal

Jegyezze meg a különbséget az i és a parancs működésében. Az első egy új sort szúr be a megadott elé, a második - utána.

Húrok cseréje

A c paranccsal módosíthatja az adatfolyam teljes szövegsorának tartalmát. Híváskor meg kell adni a vonal számát, amely helyett új adatot kell hozzáadni a folyamhoz:

$ sed "3c\Ez egy módosított sor." saját fájl


Egy teljes karakterlánc cseréje

Ha egy mintát egyszerű szöveg vagy reguláris kifejezés formájában használ egy parancs meghívásakor, akkor a mintának megfelelő összes karakterlánc lecserélődik:

$ sed "/This is/c Ez egy megváltozott szövegsor." saját fájl


Karakterláncok cseréje mintával

Karakterek cseréje

Az y parancs egyes karakterekkel működik, lecserélve azokat a hívásakor átadott adatok szerint:

$sed "y/123/567/" saját fájl


Karakterek cseréje

A parancs használatakor figyelembe kell venni, hogy a teljes szövegfolyamra vonatkozik, nem korlátozódhat a karakterek meghatározott előfordulására.

Sorszámok megjelenítése

Ha a sed-et a = paranccsal hívja meg, a segédprogram kiírja a sorszámokat az adatfolyamban:

$sed "=" saját fájl


Sorszámok megjelenítése

A folyamszerkesztő sorszámokat jelenített meg a tartalom előtt.

Ha mintát ad át ennek a parancsnak, és a sed -n kapcsolót használja, csak a mintának megfelelő sorszámok kerülnek kinyomtatásra:

$ sed -n "/teszt/=" saját fájl


A mintának megfelelő sorszámok nyomtatása

Beszúrási adatok olvasása fájlból

Fentebb megvizsgáltuk az adatok adatfolyamba történő beillesztésének technikáit, jelezve, hogy mit kell közvetlenül beszúrni a sed hívásakor. Fájlokat is használhat adatforrásként. Ehhez használja az r parancsot, amely lehetővé teszi, hogy egy adott fájlból adatokat szúrjon be egy adatfolyamba. Híváskor megadható a sorszám, amely után a fájl tartalmát, vagy mintát szeretnénk beszúrni.

Nézzünk egy példát:

$sed "3r newfile" myfile


Fájltartalom beszúrása egy adatfolyamba

Itt a newfile fájl tartalma a myfile fájl harmadik sora után került beszúrásra.

Ez történik, ha a mintát használja az r parancs meghívásakor:

$ sed "/test/r newfile" myfile


Helyettesítő karakter használata az r parancs meghívásakor

A fájl tartalma minden, a mintának megfelelő sor után beszúrásra kerül.

Példa

Képzeljünk el egy ilyen feladatot. Van egy fájl, amiben van egy bizonyos karaktersorozat, ami önmagában értelmetlen, amit egy másik fájlból vett adatokkal kell helyettesíteni. Mégpedig legyen egy új fájl, amelyben a DATA karaktersorozat játssza a helyőrző szerepét. Az adatfájlban tárolódnak azok az adatok, amelyeket az ADAT helyett kell helyettesíteni.

Ezt a problémát a sed folyamszerkesztő r és d parancsainak használatával oldhatja meg:

$ Sed "/DATA>/ ( r newfile d)" myfile


A helyőrző lecserélése valós adatokra

Mint látható, a DATA helyőrző helyett a sed két sort adott az adatfájlból a kimeneti adatfolyamhoz.

Eredmények

Ma megnéztük a sed stream szerkesztővel való munka alapjait. Valójában a sed hatalmas téma. Elsajátítása összehasonlítható egy új programozási nyelv elsajátításával, de miután megértette az alapokat, bármilyen szinten elsajátíthatja a sed-et. Ennek eredményeként annak a képességének, hogy szövegeket dolgozzon fel vele, csak a képzelet szab határt.

Ez minden mára. Legközelebb az awk adatfeldolgozó nyelvről fogunk beszélni.

Kedves olvasóink! Használod a sed-et a mindennapi munkád során? Ha igen, kérem ossza meg tapasztalatait.

Legutóbb a bash szkriptekben lévő függvényekről beszéltünk, különösen arról, hogyan hívhatjuk meg őket a parancssorból. Mai témánk egy nagyon hasznos eszköz a karakterlánc-adatok feldolgozására - egy sed nevű Linux segédprogram. Gyakran használják naplófájlok, konfigurációs és egyéb fájlok formájában lévő szövegek kezelésére.



Ha bármilyen adatkezelést végez a bash szkriptekben, akkor ismernie kell a sed és a gawk eszközöket. Itt a sed-re és a szövegekkel való munkára fogunk összpontosítani, mivel ez egy nagyon fontos lépés a bash szkriptek fejlesztésének hatalmas kiterjedésein keresztüli utazásunk során.

Most megnézzük a sed-vel való munka alapjait, és több mint három tucat példát tekintünk ennek az eszköznek a használatára.

A sed-vel való munka alapjai

A sed segédprogramot streaming szövegszerkesztőnek nevezik. Az olyan interaktív szövegszerkesztőkben, mint a nano, a szövegekkel dolgozhat a billentyűzet használatával, szerkesztheti a fájlokat, szövegeket adhat hozzá, törölhet vagy módosíthat. A Sed lehetővé teszi az adatfolyamok szerkesztését a fejlesztő által meghatározott szabálykészletek alapján. Így néz ki ez a parancs:

$sed beállítási fájl
Alapértelmezés szerint a sed a meghívásakor megadott szabályokat alkalmazza, parancsok halmazaként kifejezve az STDIN-re. Ez lehetővé teszi az adatok közvetlen továbbítását a sed számára.

Például így:

$ echo "Ez egy teszt" | sed "s/teszt/egy másik teszt/"
Ez történik a parancs futtatásakor.


Egy egyszerű példa a sed hívására

Ebben az esetben a sed a „teszt” szót a feldolgozásra átadott sorban az „egy másik teszt” szavakra cseréli. Az idézőjelbe tett szöveg feldolgozására vonatkozó szabály megfogalmazásához perjeleket használnak. Esetünkben olyan parancsot használtunk, mint az s/minta1/minta2/. Az „s” betű a „helyettesítő” szó rövidítése, vagyis van egy helyettesítő parancsunk. A Sed ezt a parancsot végrehajtva átnézi a továbbított szöveget, és a minta1-nek megfelelő töredékeket (a továbbiakban arról lesz szó, hogy melyiket) lecseréli minta2-re.

A fenti egy primitív példa a sed használatára, hogy felgyorsítsa a sebességet. Valójában a sed sokkal összetettebb szövegfeldolgozási forgatókönyvekben használható, például fájlokkal való munka során.

Az alábbiakban egy fájl található, amely egy szövegrészt és a paranccsal végzett feldolgozás eredményeit tartalmazza:

$ sed "s/teszt/egy másik teszt" ./myfile


Szöveges fájl és feldolgozási eredményei

Ez ugyanazt a megközelítést használja, mint fentebb, de most a sed feldolgozza a fájlban tárolt szöveget. Ha azonban a fájl elég nagy, akkor észre fogja venni, hogy a sed az adatokat darabokban dolgozza fel, és a feldolgozott adatokat megjeleníti a képernyőn anélkül, hogy megvárná a teljes fájl feldolgozását.

A Sed nem változtatja meg az általa feldolgozott fájl adatait. A szerkesztő beolvassa a fájlt, feldolgozza az olvasottakat, és a kapott kimenetet elküldi az STDOUT-nak. Annak érdekében, hogy megbizonyosodjon arról, hogy a forrásfájl nem változott, elegendő megnyitni, miután átvitte a sed-re. Ha szükséges, a sed kimenete átirányítható egy fájlba, esetleg felülírva a régi fájlt. Ha ismeri a sorozat egyik korábbi részét, amely a bemeneti és kimeneti adatfolyamok átirányításával foglalkozik, akkor ezt meg kell tudnia tenni.

Parancskészletek végrehajtása a sed hívásakor

Ha több műveletet szeretne végrehajtani az adatokon, használja a -e kapcsolót a sed hívásakor. Például a következőképpen szervezheti meg két szövegrészlet cseréjét:

$ sed -e "s/Ez/az/; s/teszt/egy másik teszt/" ./myfile


Az -e kapcsoló használata a sed hívásakor

Mindkét parancs a fájl minden sorára vonatkozik. Pontosvesszővel kell elválasztani őket, és nem szabad szóközt hagyni a parancs vége és a pontosvessző között.
Ha több szövegfeldolgozási mintát szeretne megadni a sed hívásakor, az első egyetlen idézőjel beírása után nyomja meg az Enter billentyűt, majd írja be az egyes szabályokat egy új sorba, a záró idézetet sem felejtve el:

$ sed -e " > s/Ez/az/ > s/teszt/egy másik teszt/" ./myfile
Ez történik az ebben a formában bemutatott parancs végrehajtása után.


Egy másik módja a sed-vel való munkavégzésnek

Parancsok olvasása fájlból

Ha sok sed parancsot kell használni a szöveg feldolgozásához, általában a legjobb, ha előre beírja őket egy fájlba. A parancsokat tartalmazó sed fájl megadásához használja a -f kapcsolót:

Íme a mycommands fájl tartalma:

S/Ez/az/s/teszt/egy másik teszt/
Hívjuk a sed-et, átadva a szerkesztőnek egy fájlt parancsokkal és egy feldolgozandó fájlt:

$ sed -f mycommands myfile
Az ilyen parancsok meghívásának eredménye hasonló az előző példákban kapott eredményhez.


Parancsfájl használata a sed hívásakor

Cserélje ki a parancsjelzőket

Nézze meg alaposan a következő példát.

$sed "s/teszt/egy másik teszt/" saját fájl
Ez az, amit a fájl tartalmaz, és amit a sed feldolgozása után kap meg.


Forrásfájl és feldolgozásának eredménye

A csere parancs általában többsoros fájlt kezel, de az egyes sorokban csak a keresett szöveg első előfordulásai kerülnek lecserélésre. A minta összes előfordulásának lecseréléséhez a megfelelő jelzőt kell használnia.

A csereparancs írásának sémája zászlók használatakor így néz ki:

S/minta/csere/zászlók
Ennek a parancsnak a végrehajtása többféleképpen módosítható.

  • A szám továbbításakor a minta karakterláncban való előfordulásának sorszámát veszik figyelembe, és ez az előfordulás kerül pótlásra.
  • A g zászló azt jelzi, hogy a minta minden előfordulását fel kell dolgozni a karakterláncban.
  • A p zászló azt jelzi, hogy az eredeti karakterlánc tartalmát ki kell nyomtatni.
  • A w fájl jelző utasítja a parancsot, hogy a szövegfeldolgozás eredményeit fájlba írja.
Fontolja meg a helyettesítő parancs első verziójának használatát, jelezve a szükséges töredék lecserélt előfordulásának helyét:

$ sed "s/teszt/egy másik teszt/2" myfile

A helyettesítő parancs meghívása, amely jelzi a cserélendő töredék helyzetét

Itt a 2-es számot adtuk meg helyettesítő jelzőként, ami oda vezetett, hogy minden sorban csak a kívánt minta második előfordulása került cserére. Most próbáljuk meg a globális helyettesítő jelzőt - g:

$ sed "s/teszt/egy másik teszt/g" myfile
Amint az a kimeneti eredményekből látható, egy ilyen parancs a minta minden előfordulását helyettesítette a szövegben.


Globális csere

A helyettesítő parancs p jelzője lehetővé teszi olyan sorok kinyomtatását, ahol egyezés található, míg a sed hívásakor megadott -n opció elnyomja a normál kimenetet:

$ sed -n "s/teszt/egy másik teszt/p" saját fájl
Ennek eredményeként, amikor a sed ebben a konfigurációban elindul, csak azok a sorok (esetünkben egy sor) jelennek meg, amelyekben a megadott szövegrészlet megtalálható.


A csere parancs jelzőjének használata p

Használjuk a w jelzőt, amellyel a szövegfeldolgozás eredményeit fájlba menthetjük:

$ sed "s/teszt/egy másik teszt/w kimenet" myfile


Szövegfeldolgozási eredmények mentése fájlba

Jól látható, hogy a parancs mûködése során az adatok kimenetre kerülnek, míg a feldolgozott sorok abba a fájlba íródnak, amelynek a neve w után van feltüntetve.

Elválasztó karakterek

Képzelje el, hogy az /etc/passwd fájlban a /bin/bash helyére cseréli a /bin/csh-t. A feladat nem olyan nehéz:

$ sed "s/\/bin\/bash/\/bin\/csh/" /etc/passwd
Ez azonban nem néz ki túl jól. A helyzet az, hogy mivel a perjeleket határoló karakterként használjuk, a sed-nek átadott karakterláncokban ugyanazokat a karaktereket kell kihagyni. Ennek eredményeként a parancs olvashatósága romlik.

Szerencsére a sed lehetővé teszi, hogy meghatározzuk saját határoló karaktereinket, amelyeket a csere parancsban használunk. Az elválasztó az s után megjelenő első karakter:

$ sed "s!/bin/bash!/bin/csh!" /etc/passwd
Ebben az esetben egy felkiáltójelet használunk elválasztóként, ennek eredményeként a kód könnyebben olvasható, és sokkal tisztábbnak tűnik, mint korábban.

Szövegtöredékek kiválasztása feldolgozásra

Eddig a sed-et hívtuk a szerkesztőnek átadott teljes adatfolyam feldolgozására. Bizonyos esetekben a sed használatával csak a szöveg egy részét kell feldolgoznia - egy adott sort vagy sorcsoportot. E cél elérése érdekében két megközelítést alkalmazhat:
  • Állítson be korlátot a feldolgozandó sorok számára.
  • Adja meg azt a szűrőt, amelynek megfelelő sorait fel kell dolgozni.
Tekintsük az első megközelítést. Itt két lehetőség van. Az első, amelyet alább tárgyalunk, magában foglalja a feldolgozandó sor számának megadását:

$sed "2s/teszt/egy másik teszt/" saját fájl


Csak egy vonal feldolgozása, a sed hívásakor megadott szám

A második lehetőség egy sor karakterlánc:

$ sed "2.3s/test/anther test/" myfile


Sorok tartományának feldolgozása

Ezenkívül meghívhatja a csere parancsot, hogy a fájl egy bizonyos sortól a végéig kerüljön feldolgozásra:

$ sed "2,$s/teszt/egyéb teszt/" myfile


A fájl feldolgozása a második sortól a végéig

Ahhoz, hogy a csere parancsot csak az adott szűrőnek megfelelő sorok feldolgozására használjuk, a parancsot a következőképpen kell meghívni:

$ sed "/likegeeks/s/bash/csh/" /etc/passwd
A fentiekkel analóg módon a sablon az s parancsnév előtt kerül átadásra.


A szűrőnek megfelelő sorok feldolgozása

Itt egy nagyon egyszerű szűrőt használtunk. Ennek a megközelítésnek a lehetőségeinek teljes kiaknázásához használhat reguláris kifejezéseket. A sorozat következő anyagainak egyikében fogunk róluk beszélni.

Sorok eltávolítása

A sed segédprogram nem csak a karakterláncok egyik karaktersorozatának másikkal való helyettesítésére használható. Segítségével, nevezetesen a d paranccsal törölhet sorokat egy szövegfolyamból.

A parancshívás így néz ki:

$sed "3d" myfile
A harmadik sort szeretnénk eltávolítani a szövegből. Kérjük, vegye figyelembe, hogy ez nem fájl. A fájl változatlan marad, a törlés csak a sed által generált kimenetet érinti.


A harmadik sor eltávolítása

Ha a d parancs meghívásakor nem adja meg a törölni kívánt sor számát, a folyam összes sora törlődik.

A következőképpen alkalmazhatja a d parancsot számos karakterláncra:

$sed "2,3d" myfile


Sorok tartományának törlése

A következőképpen törölheti a sorokat az adott sortól kezdve a fájl végéig:

$sed "3,$d" saját fájl


Sorok törlése a fájl végéig

A sorok a következő mintával is törölhetők:

$ sed "/test/d" saját fájl


Sorok eltávolítása mintával

A d hívásakor megadhat egy pár mintát - a sorok, amelyekben a minta előfordul, és a közöttük lévő sorok törlődnek:

$ sed "/second/,/fourth/d" myfile


Sorok tartományának eltávolítása helyettesítő karakterekkel

Szöveg beszúrása egy adatfolyamba

A sed segítségével adatokat szúrhat be egy szövegfolyamba az i és a parancsok használatával:
  • Az i parancs egy új sort ad a megadott elé.
  • Az a parancs egy új sort ad a megadott után.
Nézzünk egy példát az i parancs használatára:

$ echo "Másik teszt" | sed "i\First teszt"


Csapat i

Most nézzük az a parancsot:

$ echo "Másik teszt" | sed "a\First teszt"


Parancs a

Amint láthatja, ezek a parancsok szöveget adnak az adatfolyamból származó adatok elé vagy után. Mi van, ha hozzá kell adni egy sort valahol a közepén?

Itt a segítségünkre lesz a folyamban, vagy sablonban található hivatkozási sor számának feltüntetése. Kérjük, vegye figyelembe, hogy a karakterláncok tartományként történő címzése itt nem működik. Hívja az i parancsot, jelezve a sor számát, amely előtt új sort kell beszúrnia:

$ sed "2i\Ez a beillesztett sor." saját fájl


Parancs i hivatkozási sorszámmal

Tegyük ugyanezt az a paranccsal:

$ sed "2a\Ez a hozzáfűzött sor." saját fájl


Parancs a hivatkozási sorszámmal

Jegyezze meg a különbséget az i és a parancs működésében. Az első egy új sort szúr be a megadott elé, a második - utána.

Húrok cseréje

A c paranccsal módosíthatja az adatfolyam teljes szövegsorának tartalmát. Híváskor meg kell adni a vonal számát, amely helyett új adatot kell hozzáadni a folyamhoz:

$ sed "3c\Ez egy módosított sor." saját fájl


Egy teljes karakterlánc cseréje

Ha egy mintát egyszerű szöveg vagy reguláris kifejezés formájában használ egy parancs meghívásakor, akkor a mintának megfelelő összes karakterlánc lecserélődik:

$ sed "/This is/c Ez egy megváltozott szövegsor." saját fájl


Karakterláncok cseréje mintával

Karakterek cseréje

Az y parancs egyes karakterekkel működik, lecserélve azokat a hívásakor átadott adatok szerint:

$sed "y/123/567/" saját fájl


Karakterek cseréje

A parancs használatakor figyelembe kell venni, hogy a teljes szövegfolyamra vonatkozik, nem korlátozódhat a karakterek meghatározott előfordulására.

Sorszámok megjelenítése

Ha a sed-et a = paranccsal hívja meg, a segédprogram kiírja a sorszámokat az adatfolyamban:

$sed "=" saját fájl


Sorszámok megjelenítése

A folyamszerkesztő sorszámokat jelenített meg a tartalom előtt.

Ha mintát ad át ennek a parancsnak, és a sed -n kapcsolót használja, csak a mintának megfelelő sorszámok kerülnek kinyomtatásra:

$ sed -n "/teszt/=" saját fájl


A mintának megfelelő sorszámok nyomtatása

Beszúrási adatok olvasása fájlból

Fentebb megvizsgáltuk az adatok adatfolyamba történő beillesztésének technikáit, jelezve, hogy mit kell közvetlenül beszúrni a sed hívásakor. Fájlokat is használhat adatforrásként. Ehhez használja az r parancsot, amely lehetővé teszi, hogy egy adott fájlból adatokat szúrjon be egy adatfolyamba. Híváskor megadható a sorszám, amely után a fájl tartalmát, vagy mintát szeretnénk beszúrni.

Nézzünk egy példát:

$sed "3r newfile" myfile


Fájltartalom beszúrása egy adatfolyamba

Itt a newfile fájl tartalma a myfile fájl harmadik sora után került beszúrásra.

Ez történik, ha a mintát használja az r parancs meghívásakor:

$ sed "/test/r newfile" myfile


Helyettesítő karakter használata az r parancs meghívásakor

A fájl tartalma minden, a mintának megfelelő sor után beszúrásra kerül.

Példa

Képzeljünk el egy ilyen feladatot. Van egy fájl, amiben van egy bizonyos karaktersorozat, ami önmagában értelmetlen, amit egy másik fájlból vett adatokkal kell helyettesíteni. Mégpedig legyen egy új fájl, amelyben a DATA karaktersorozat játssza a helyőrző szerepét. Az adatfájlban tárolódnak azok az adatok, amelyeket az ADAT helyett kell helyettesíteni.

Ezt a problémát a sed folyamszerkesztő r és d parancsainak használatával oldhatja meg:

$ Sed "/DATA>/ ( r newfile d)" myfile


A helyőrző lecserélése valós adatokra

Mint látható, a DATA helyőrző helyett a sed két sort adott az adatfájlból a kimeneti adatfolyamhoz.

Eredmények

Ma megnéztük a sed stream szerkesztővel való munka alapjait. Valójában a sed hatalmas téma. Elsajátítása összehasonlítható egy új programozási nyelv elsajátításával, de miután megértette az alapokat, bármilyen szinten elsajátíthatja a sed-et. Ennek eredményeként annak a képességének, hogy szövegeket dolgozzon fel vele, csak a képzelet szab határt.

Ez minden mára. Legközelebb az awk adatfeldolgozó nyelvről fogunk beszélni.

Kedves olvasóink! Használod a sed-et a mindennapi munkád során? Ha igen, kérem ossza meg tapasztalatait.

A Sed egy könnyű (a bináris csak 128 kilobájtot nyom) és kényelmes szövegfeldolgozó eszköz.

Ebben a cikkben néhány egyszerű használati példát mutatok be sedés elmondja a főbb képességeit.

A Sed soronként vesz egy bemeneti adatfolyamot vagy fájlt, szerkeszti az egyes sorokat a sed parancsfájlban meghatározott szabályok szerint, majd kiadja az eredményt. A Sed egy Turing teljes programozási nyelv.

sed parancsformátum

A sed parancs formátuma:

sed [-n] [-e script] [-f script fájl] [fájlok]

Zászló -n elnyomja a kimenetet
-e- mutat a parancssorban adott utasítások listájára.
-f- jelzi a script fájl helyét.

Parancsformátum szerkesztése

A script fájl egy sor parancsból áll:

[ cím [ cím ] ] parancs [ argumentumok ]

minden sorban egyet.
A címek sorszámok, speciális karakterek vagy reguláris kifejezések:

$ - utolsó sor
start~N- Minden egyes N-a számtól kezdődő sor Rajt
/reguláris kifejezés/- a szabályos_kifejezés alá eső sorok
Példák:

1~2 - Minden második sorban /REGEXP/- minden sor, amelyben előfordul /REGEXP/ 10,20 - sorok 10-től 20-ig 10,+10 - sorok 10-től 20-ig 5,~N- sorok az 5.-től kezdve az első többszörösig N 5,/REGEXP/- tartalmazó sorok /REGEXP/, az 5. után (az 5. nélkül)
  • Ha nincs megadva cím, akkor az összes sor feldolgozásra kerül.
  • Ha egy címet adunk meg, akkor a megfelelő sor kerül feldolgozásra
  • Ha két cím van megadva, akkor a megadott intervallum sorai kerülnek kiválasztásra.
  • !csapat- előadták csapat, a nem cím alapján kiválasztott sorokhoz.

Alapvető parancsok

Nézzük az alapvető parancsokat:

[cím] egy szöveg- a megadott sor után új sort írjon be szöveggel

$ cat sed_test sed_test_1 11111 sed_test_2 22222 sed_test_3 33333 $ sed -e "2 a new_line" sed_test sed_test_1 11111 sed_test_2 22222 new_line sed_test_3 3333

[cím [, cím]] c szöveg- Eltávolítja a kijelölt sorokat, és helyettesíti őket szöveg

$ sed -e "2 with new_line" sed_test sed_test_1 11111 new_line sed_test_3 33333 $ sed -e "/3/ with new_line" sed_test sed_test_1 11111 sed_test_2 22222 new_line

[cím [, cím]] d- Törli a megadott sorokat.

$ sed -e "2 d" sed_test sed_test_1 11111 sed_test_3 33333 $ sed -e "2!d" sed_test sed_test_2 22222

[cím] i text- Helyezze be szöveg a megadott sor helyére.

$ sed -e "2 i new_line" sed_test sed_test_1 11111 new_text sed_test_2 22222 sed_test_3 33333

[cím [, cím]] p(zászlóval -n) megjeleníti a talált sorokat.

$ sed -ne "2p" sed_test sed_test_2 22222

[cím]q- kilépés a sed-ből.

[cím [, cím]] r fájl- Olvas fájltés kiadja annak tartalmát.

[cím [, cím]] s/regex/replacement/flags- Cseréli reguláris kifejezés tovább csere- figyelembe véve a zászlókat:

  • g - a teljes sorban
  • i - kis- és nagybetű nem érzékeny
  • p - a csere eredményének megjelenítése
$ sed -ne "s/t/T/g" sed_test sed_TesT_1 11111 sed_TesT_2 22222 sed_TsT_3 33333 $ sed -e "s//d/g" sed_test sed_test_d ddddd sed_test_d ddd_test_dd dd

[cím [, cím]] y/line1/line2/- Lecseréli a karakterek összes előfordulását sor1 származó megfelelő szimbólumok vonalak2. A vonalak hosszának azonosnak kell lennie.

$ sed -ne "y/est/EST/g" sed_test SEd_TEST_1 11111 SEd_TEST_2 22222 SEd_TEST_3 33333

[cím[,cím]] (parancsok)- zárójelben a csoportparancsok
[cím] =- Sorszámokat ad

Címkék

: címke- egyezik a parancsok csoportjával címke
b címke címke, Ha címke hiányzik, majd lépjen a parancsfájl végére.

t címkét- lépjen a címke által jelzett parancsra címke csak sikeres csere után a paranccsal s///

Végrehajtási hurok

A sed két adatpufferrel működik: egy fő és egy kiegészítő pufferrel. Kezdetben mindkét puffer üres.
Az ezekkel a pufferekkel való munkavégzés a következő parancsokkal történik: \\`h', 'H', 'x', 'g', 'G' 'D' h- Cserélje ki a kiegészítő puffer tartalmát a fő puffer tartalmára
H- Adjon hozzá egy új sort a kiegészítő pufferhez, majd fűzze hozzá a fő puffer tartalmát a kiegészítő puffer tartalmához
x- Cserélje fel mindkét puffer tartalmát
g- Cserélje ki a fő puffer tartalmát a kiegészítő puffer tartalmára
G- Adjon hozzá egy új sort a fő pufferhez, majd fűzze hozzá a kiegészítő puffer tartalmát a fő puffer tartalmához
D- Törölje a fő puffer szövegét a következő újsor karakterig
N- Adjon hozzá egy új sort a fő pufferhez, majd adja hozzá a következő feldolgozandó sort
P- Nyomtassa ki a fő puffer tartalmát a következő újsor karakterig.

Bonyolultabb példák

A következő szkript felcseréli a fájl sorait (az első sorok lesznek az utolsók és fordítva)

$ cat tac.sed #!/usr/bin/sed -nf # a második sortól kezdve a puffer tartalma (amely már tartalmazza # az összes előző sort) hozzáfűződik az aktuális sorhoz. 1! G # az utolsó sor elérésekor - print $ p # Írja be újra az adatokat a pufferbe h sed -nf tac.sed sed_test sed_test_3 33333 sed_test_2 22222 sed_test_1 11111

Megszámoljuk a fájl sorait (az utolsó sor számát jelenítjük meg)

$ cat count.sed #!/usr/bin/sed -nf $=

eredmény

$ sed -nf count.sed sed_test 3

String megfordítása

$ cat revers.sed #!/usr/bin/sed -f # egy /../ betűt tartalmazó sorok kihagyása! b # Fordítsa meg a karakterláncot. Adjon hozzá egy üres sort az aktuális elé és után. s/%$@~*!G4;:%#`.*$/\ &\ / # Mozgassa az első karaktert a végére # a ciklus addig működik, amíg vannak karakterek a középső sorban. tx:x s/\(\\n.\)\(.*\)\(.\\n\)/\\3\\2\\1/ tx #felesleges sortörések eltávolítása s/\\n// g

Ez a szkript egyszerre két betűt mozgat.

$ sed -f revers.sed sed_test 11111 1_tset_des 22222 2_tset_des 33333 3_tset_des

további információ

A sed szkriptek formátumáról többet tudhat meg a kézikönyv elolvasásával férfi sed vagy műszaki dokumentációt info sed.


Szerző: Rares Aioanei
Megjelenés időpontja: 2011. november 19
Fordítás: A. Krivoshey
Fordítás dátuma: 2012. július

Nikolay Ignatushko a cikkben említett összes parancsot tesztelte a GNU sed 4.2.1-es verzióján a Gentoo disztribúcióban. Nem minden szkript működött jól a GNU sed verzión. De apró dolgokról volt szó, amelyeket kijavítottak. Csak a domb hegyekkel való helyettesítésének forgatókönyvét kellett jelentősen módosítani.

1. Bemutatkozás

Üdvözöljük sorozatunk második részében a sed-en, a GNU verzióban. A sednek több verziója is elérhető különböző platformokon, de mi a GNU sed 4.x verziójára fogunk összpontosítani. Sokan hallottatok a sed-ről, vagy már használták is, valószínűleg csereeszközként. De ez csak az egyik célja a sednek, és megpróbáljuk bemutatni a segédprogram használatának minden vonatkozását. A neve a „Stream EDitor” rövidítése, és a „stream” szó ebben az esetben fájlt, csatornát vagy egyszerűen stdin-t jelenthet. Reméljük, hogy már rendelkezik alapismeretekkel a Linuxról, és ha már dolgozott reguláris kifejezésekkel, vagy legalább tudja, mik azok, akkor minden sokkal könnyebb lesz. A szóköz nem teszi lehetővé, hogy teljes oktatóanyagot tartalmazzon a reguláris kifejezésekről; ehelyett az alapfogalmakat ismertetjük, és rengeteg példát adunk a sed használatára.

2. Telepítés

Itt nem kell sokat mondani. Valószínűleg már az összes sed telepítve van, mivel különféle rendszerszkriptek, valamint a termelékenységüket növelni kívánó Linux-felhasználók használják. A következő paranccsal megtudhatja, hogy a sed melyik verzióját telepítette:

$sed --verzió

A rendszeremen ez a parancs azt mutatja, hogy telepítettem a GNU sed 4.2.1-et, valamint egy hivatkozást a program kezdőlapjára és egyéb hasznos információkat. A csomag neve "sed" a terjesztéstől függetlenül, kivéve a Gentoo-t, ahol implicit módon jelen van.

3. Fogalmak

Mielőtt továbbmennénk, fontosnak tartjuk, hogy a „sed” tevékenységére összpontosítsunk, mivel a „folyamszerkesztő” kifejezés nem sokat mond a céljáról. A sed szöveget vesz bevitelként, minden soron végrehajtja a megadott műveleteket (hacsak nincs másként megadva), és kiadja a módosított szöveget. A megadott műveletek lehetnek hozzáadás, beszúrás, törlés vagy csere. Ez nem olyan egyszerű, mint amilyennek látszik: figyelem, számos opció és opciókombináció létezik, amelyek nagyon megnehezíthetik a sed parancs megértését. Ezért azt javasoljuk, hogy tanulja meg a reguláris kifejezések alapjait, hogy megértse, hogyan működik. Mielőtt elkezdenénk az oktatóanyagot, szeretnénk megköszönni Eric Pementnek és másoknak az inspirációt és azt, amit mindenkiért tett, aki szeretné megtanulni és használni a sed-et.

4. Reguláris kifejezések

Mivel a sed parancsok (szkriptek) sokak számára rejtélyek maradnak, úgy érezzük, olvasóinknak meg kell érteniük az alapfogalmakat, nem pedig vakon másolni és beilleszteni azokat a parancsokat, amelyek jelentését nem értik. Ha valaki meg akarja érteni, mik azok a reguláris kifejezések, akkor a kulcsszó az „illesztés”, pontosabban a „mintaillesztés”. Például egy, az osztálya számára készített jelentésben a Nick nevet írta be, utalva a hálózati építészre. De Nick elment, és John jött a helyére, így most a Nick szót Johnra kell cserélnie. Ha a jelentésfájl neve report.txt, akkor a következő parancsot kell futtatnia:

$ cat report.txt | sed "s/Nick/John/g" > report_new.txt

A sed alapértelmezés szerint az stdout-ot használja, és használhatja a kimeneti átirányítási operátort a fenti példában látható módon. Ez egy nagyon egyszerű példa, de néhány pontot szemléltetünk: megkeressük a „Nick” mintára vonatkozó összes egyezést, és minden esetben „John”-ra cseréljük. Vegye figyelembe, hogy a sed keresések megkülönböztetik a kis- és nagybetűket, ezért legyen óvatos, és ellenőrizze a kimeneti fájlt, hogy megbizonyosodjon arról, hogy minden csere megtörtént. A fenti példa így írható:

$ sed "s/Nick/John/g" report.txt > report_new.txt

Oké, mondhatod, de hol vannak a reguláris kifejezések? Igen, először példát akartunk mutatni, és most jön az érdekes rész.
Ha nem biztos abban, hogy "nick" vagy "Nick"-t írt, és mindkét esetet le akarja fedni, akkor az "s/Nick|nick/John/g" sed parancsot kell használnia. A függőleges sávnak van egy jelentése, amit tudnia kell, ha tanulta a C-t, vagyis a kifejezése megegyezik a "nick" vagy a "nick" kifejezéssel. Amint alább látni fogja, a csatorna más módon is használható, de a jelentés ugyanaz marad. A reguláris kifejezésekben gyakran használt egyéb operátorok a "?", amely megegyezik az előző karakter nulla vagy egyszeri ismétlésével (vagyis a flavou?r megegyezik az ízzel és az ízzel), "*" - nulla vagy több alkalommal, "+" - egy vagy több alkalommal. A "^" egy sor elejére egyezik, a "$" pedig az ellenkezője. Ha Ön vim vagy vim felhasználó, sok dolog ismerősnek fog tűnni. Végül is ezek a segédprogramok az awk-val és a C-vel együtt a UNIX korai idejére nyúlnak vissza. Erről a témáról nem fogunk többet beszélni, mivel ezeknek a karaktereknek a jelentését példákkal könnyebb megérteni, de tudnia kell, hogy a reguláris kifejezéseknek különféle megvalósításai vannak: POSIX, POSIX Extended, Perl, valamint a fuzzy reguláris különféle megvalósításai. olyan kifejezések, amelyek garantáltan fejfájást okoznak.

5. Példák a sed használatára

Parancs szintaxis Leírás

Sed "s/Nick/John/g" report.txt

Nick minden előfordulását Johnra cseréli a report.txt fájlban

Sed "s/Nick\|nick/John/g" report.txt

A Nick vagy a becenév minden előfordulását Johnra cseréli.

Sed "s/^/ /" file.txt > file_new.txt

8 szóközt ad a szöveg bal oldalán a nyomtatási minőség javítása érdekében.

Sed -n "/Természetesen/,/figyelem fizet/p" myfile

Megjeleníti az összes olyan bekezdést, amely a „Természetesen” szóval kezdődik, és a „figyelem, amit fizet”.

Sed -n 12,18p fájl.txt

Csak a file.txt 12-18. sorát adja ki

Sed 12,18d file.txt

Kinyomtatja a teljes file.txt fájlt, kivéve a 12-18. sorokat
Egy üres sort szúr be a file.txt minden sora után

Sed -f script.sed fájl.txt

Minden parancsot beír a script.sed fájlba, és végrehajtja azokat.

Sed "5!s/ham/cheese/" file.txt

A sonkát sajttal helyettesíti a file.txt fájlban, kivéve az 5. sort

Sed "$d" file.txt

Eltávolítja az utolsó sort

Sed -n "/\(3\)/p" file.txt

Csak három egymást követő számjegyből álló sorokat nyomtat

Sed "/boom/s/aaa/bb/" file.txt

Ha "boom" található, cserélje ki az aaa-t bb-re

Sed "17,/disk/d" file.txt

Törli az összes sort a 17. sortól a "lemezig". Ha több sor van "lemezzel", törli az elsőt.

Echo ONE TWO | sed "s/one/unos/I"

Kis- és nagybetűtől függetlenül lecseréli az egyiket unos-ra, így az "unos TWO" feliratot fogja kiírni.

Sed "G;G" file.txt

Két üres sort szúr be a file.txt minden sora után

Sed "s/.$//" file.txt

A dos2unix lecserélésének módja :). Általában eltávolítja minden sor utolsó karakterét.

Sed "s/^[ \t]*//" file.txt

Eltávolítja az összes szóközt/tabulátort a file.txt sorai előtt

Sed "s/[ \t]*$//" file.txt

Eltávolítja az összes szóközt/tabulátort a file.txt minden sorának végéről

Sed "s/^[ \t]*//;s/[ \t]*$//" file.txt

Eltávolítja az összes szóközt/tabulátort a file.txt minden sorának elején és végén

Sed "s/foo/bar/" file.txt

A foo szót bar-ra cseréli csak a sor első előfordulásakor.

Sed "s/foo/bar/4" file.txt

A foo szót bar-ra cseréli csak a sor negyedik előfordulásakor.

Sed "s/foo/bar/g" file.txt

A foo szót bar-ra cseréli a karakterlánc minden előfordulásakor.

Sed "/baz/s/foo/bar/g" file.txt

Csak akkor cserélje ki a foo-t bar-ra, ha a karakterlánc tartalmaz bazt.

Sed "/./,/^$/!d" file.txt

Tömörítse az összes egymást követő üres sort egybe. A tetején nincs üres sor.

Sed "/^$/N;/\n$/D" file.txt

Sűrítse az összes egymást követő üres sort egybe, de a felső sort hagyja üresen.

Sed "/./,$!d" file.txt

Távolítsa el az összes vezető üres sort

Sed -e:a -e "/^\n*$/($d;N;);/\n$/ba" file.txt

Távolítsa el az összes utolsó üres sort

Sed -e:a -e "/\\$/N; s/\\\n/ /; ta" file.txt

Ha egy sor backsplash-re végződik, fűzze össze a következővel (shell szkripteknél hasznos)

Sed -n "/regex/,+5p" file.txt

A reguláris kifejezést tartalmazó sor után 5 sort nyomtat

Sed "1~3d" file.txt

Töröljön minden harmadik sort, az elsőtől kezdve.

Sed -n "2~5p" file.txt

Nyomtasson minden ötödik sort a másodiktól kezdve.

Sed "s/ick/John/g" report.txt

A fenti példák egy másik módja. Tudod ajánlani a tiédet?

Sed -n "/RE/(p;q;)" fájl.txt

Kinyomtatja az első RE (reguláris kifejezés) egyezést tartalmazó sort

Sed "0,/RE/(//d;)" file.txt

Eltávolítja a karakterláncot az első egyezéssel

Sed "0,/RE/s//to_that/" file.txt

Csak az első meccsen változtat

Sed "s/^[^,]*,/9999,/" file.csv

A CSV-fájl első oszlopában lévő összes értéket 9999-re cseréli

S/^ *\(.*[^ ]\) *$/|\1|/; s/" *, */"|/g; : hurok s/| *\([^",|][^,|]*\) *, */|\1|/g; s/| *, */||/g; t ciklus s/ *|/|/g s/| */|/g, s/^|\(.*\)|$/\1/;

Sed-szkript a CSV-fájlok csőhatárolóval ellátott fájllá konvertálásához (csak bizonyos CSV-típusokkal működik, amelyek beágyazott idézőjeleket és vesszőket tartalmaznak).

Sed ":a;s/\(^\|[^0-9.]\)\(\+\)\(\(3\)\)/\1\2,\3/g;ta" fájl .txt

Módosítja a file.txt számformátumát 1234,56-ról 1 234,56-ra

Sed -r "s/\<(reg|exp)+/\U&/g"

Bármely reg vagy exp betűvel kezdődő szót nagybetűvé alakít.

Sed "1.20 s/Johnson/White/g" file.txt

Csak az 1-20. sorban Johnsont White-ra cseréli.

Sed "1.20 !s/Johnson/White/g" file.txt

Az előző példa fordított (mindenhol lecseréli, kivéve az 1-20. sorokat)

Sed "/from/,/until/ ( s/\<red\>/magenta/g; s/<blue\>/cyan/g; )" file.txt

Csak a "tól" és az "amíg" között helyettesíti. Ha több "tól"-"ig" terület van, mindegyikben lecseréli.

Sed "/ENDNOTES:/,$ ( s/Schaff/Herzog/g; s/Kraft/Ebbing/g; )" file.txt

Csak az "ENDNOTES:" szót helyettesíti az EOF-ra

Sed "/./(H;$!d;);x;/regex/!d" file.txt

Csak akkor nyomtat egy bekezdést, ha az tartalmazza a szabályos kifejezést

Sed -e "/./(H;$!d;)" -e "x;/RE1/!d;/RE2/!d;/RE3/!d" file.txt

Csak akkor nyomtatja ki a bekezdéseket, ha azok tartalmazzák az RE1-et, RE2-t és az RE3-at. Az RE1, RE2 és RE3 sorrendje nem számít.

Sed "s/14"/tizennégy hüvelyk/g" fájl.txt

Így használhat dupla idézőjeleket

Sed "s/\/some\/UNIX\/path/\/a\/new\/path/g" file.txt

Munka Unix Paths

Sed "s///g" file.txt

Eltávolítja az összes a-val kezdődő és g-vel végződő karaktert a fájl.txt fájlból

Sed "s/\(.*\)foo/\1bar/" file.txt

Csak az utolsó foo egyezést helyettesíti a karakterláncban a bárral

Sed "1!G;h;$!d"

A tac parancs cseréje

Sed "/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//"

A fordulat parancs cseréje

Sed 10q file.txt

A fej parancs cseréje

Sed -e:a -e "$q;N;11,$D;ba" fájl.txt

A farok parancs cseréje

Sed "$!N; /^\(.*\)\n\1$/!P; D" file.txt

Az uniq parancs cseréje

Sed "$!N; s/^\(.*\)\n\1$/\1/;t; D" file.txt

Fordított parancs (egyenértékű az uniq -d-vel)

Sed "$!N;$!D" file.txt

Egyenértékű a farok -n 2-vel

Sed -n "$p" file.txt

... farok -n 1 (vagy farok -1)

Sed "/regexp/!d" file.txt

Egyenértékű a grep-pel

Sed -n "/regexp/(g;1!p;);h" file.txt

Kinyomtatja a reguláris kifejezés első egyezését megelőző sort, de magát az egyezést nem tartalmazza

Sed -n "/regexp/(n;p;)" fájl.txt

Kinyomtatja a sort az első reguláris kifejezés egyezése után, de magát az egyezést nem tartalmazza

Sed "/pattern/d" file.txt

Eltávolítja a mintának megfelelő vonalakat

Sed "/./!d" file.txt

Eltávolítja az összes üres sort a fájlból

Sed "/^$/N;/\n$/N;//D" file.txt

Az összes egymást követő üres sort két üres sorba sűríti. Egyetlen üres sor nem módosul.

Sed -n "/^$/(p;h;);/./(x;/./p;)" file.txt

Eltávolítja az egyes bekezdések utolsó sorát
Lekéri az üzenet fejlécét. Más szóval, az első üres sor után mindent töröl.