A sed parancs használata Linux alatt

Lehet, hogy őrültnek hangzik, de a Linux sedparancs felület nélküli szövegszerkesztő. A parancssorból használhatja a fájlokban és az adatfolyamokban lévő szöveg kezelésére. Megmutatjuk, hogyan lehet kihasználni az erejét.

A sed ereje

A sedparancs kissé hasonlít a sakkra: egy órába telik az alapok megtanulása, és egy életre van szükség azok elsajátításához (vagy legalábbis sok gyakorlathoz). Megmutatjuk a kezdő szerencsejátékokat a sedfunkciók fő kategóriáinak mindegyikében .

sedegy adatfolyam-szerkesztő, amely csővezetékes bevitelen vagy szövegfájlokon dolgozik. Nem rendelkezik azonban interaktív szövegszerkesztő felülettel. Inkább utasításokat ad, hogy kövesse, ahogy a szövegen keresztül működik. Mindez a Bash és más parancssori héjakban működik.

Az sedalábbiak mindegyikével megteheti:

  • Válasszon szöveget
  • Helyettesítse a szöveget
  • Vonalak hozzáadása a szöveghez
  • Sorok törlése a szövegből
  • Az eredeti fájl módosítása (vagy megőrzése)

Példáinkat koncepciók bemutatására és bemutatására építettük, nem pedig a legcsekélyebb (és legkevésbé megközelíthető) sedparancsok előállítására. A mintaillesztés és a szövegválasztási funkciók azonban sed nagymértékben támaszkodnak a reguláris kifejezésekre (regexek). Szükséged lesz ezek ismeretére, hogy a legtöbbet hozhasd ki sed.

KAPCSOLÓDÓ: Hogyan használjuk a rendszeres kifejezéseket (regexes) Linux rendszeren

Egyszerű példa

Először egy csövön keresztül echoküldünk szöveget sed, és sed helyettesítjük a szöveg egy részét. Ehhez írja be a következőket:

visszhangja howtogonk | sed 's / gonk / geek /'

A echoparancs a „howtogonk” üzenetet küldi sed, és az egyszerű helyettesítési szabályunkat (az „s” helyettesítést jelenti) alkalmazzuk. sed a beviteli szövegben megkeresi az első karakterlánc előfordulását, és minden egyezést lecserél a másodikra.

A „gonk” karakterlánc helyébe „geek” lép, és az új karakterláncot kinyomtatja a terminál ablakában.

A helyettesítések valószínűleg a leggyakoribbak sed. Mielőtt azonban mélyebben elmélyedhetnénk a helyettesítésekben, tudnunk kell a szöveg kiválasztását és egyeztetését.

Szöveg kiválasztása

Szükségünk lesz egy szöveges fájlra a példáinkhoz. Olyan verseket fogunk használni, amelyek Samuel Taylor Coleridge „Az ókori Mariner cselszövése” című epikus verséből válogatnak verseket.

A következőket írjuk be, hogy megnézhessük less:

kevesebb coleridge.txt

A fájlból néhány sor kiválasztásához megadjuk a kijelölni kívánt tartomány kezdő és záró sorát. Egyetlen szám választja ki azt az egy sort.

Az egy-négy sor kivonásához írja be ezt a parancsot:

sed -n '1,4p' coleridge.txt

Vegye figyelembe a 1és a vesszőt 4. Ez pazt jelenti, hogy "illesztett vonalakat nyomtat". Alapértelmezés szerint  sed kinyomtatja az összes sort. A fájlban lévő összes szöveget kétszer kinyomtatnánk. Ennek megakadályozása érdekében a -n(csendes) opciót használjuk a páratlan szöveg elnyomására.

Megváltoztatjuk a sorszámokat, hogy kiválaszthassunk egy másik verset, az alábbiak szerint:

sed -n '6,9p' coleridge.txt

Használhatjuk a -e(kifejezés) opciót többszörös kiválasztáshoz. Két kifejezéssel két verset választhatunk ki, így:

sed -n -e '1,4p' -e '31, 34p 'coleridge.txt

Ha csökkentjük az első számot a második kifejezésben, akkor a két vers közé vakot helyezhetünk. A következőket írjuk be:

sed -n -e '1,4p' -e '30, 34p 'coleridge.txt

Kiválaszthatunk egy kezdő sort is, és megadhatjuk, sed hogy lépjen végig a fájlon, és nyomtasson alternatív sorokat, minden ötödik sort, vagy hagyjon ki tetszőleges számú sort. A parancs hasonló ahhoz, amit fentebb használtunk egy tartomány kiválasztásához. Ezúttal azonban ~vessző helyett tildét ( ) használunk a számok elválasztására.

Az első szám a kezdő sort jelöli. A második szám megmondja sed, hogy a kezdő vonal után mely vonalakat szeretnénk látni. A 2. szám minden második sort, a 3 minden harmadik sort jelent stb.

A következőket írjuk be:

sed -n '1 ~ 2p' coleridge.txt

Nem mindig fogja tudni, hogy a keresett szöveg hol található a fájlban, ami azt jelenti, hogy a sorszámok nem mindig lesznek sok segítség. Használhatja sed azonban azokat a sorokat is, amelyek megfelelõ szövegmintákat tartalmaznak. Például vonjunk ki minden sort, amely az „And” -gal kezdődik.

A caret ( ^) a sor kezdetét jelenti. Keresési kifejezésünket perjelekkel ( /) mutatjuk be . Szóközt is írunk az „And” után, így az „Android” szavak nem szerepelnek az eredményben.

A sedszkriptek olvasása eleinte kissé nehéz lehet. A /p nyomtatás jelentése éppen olyan, mint a fent használt parancsokban. A következő parancsban azonban egy előre mutató perjel megelőzi:

sed -n '/ ^ And / p' coleridge.txt

Három „And” betűvel kezdődő sort kivonunk a fájlból, és megjelenítjük nekünk.

Cserék

Első példánkban a következő alapformátumot mutattuk be a sedhelyettesítéshez:

visszhangja howtogonk | sed 's / gonk / geek /'

Az smondja sed , ez egy cserét. Az első karakterlánc a keresési minta, a második pedig az a szöveg, amellyel az egyező szöveget ki akarjuk cserélni. Természetesen, mint minden más Linux esetében, az ördög is a részletekben rejlik.

A következőket írjuk be, hogy a „nap” minden előfordulását „hétre” változtassuk, és több időt biztosítsunk a tengerésznek és az albatrossznak a kötésre:

sed -n 's / nap / hét / p' coleridge.txt

Az első sorban csak a „nap” második előfordulása változik. Ez azért van, mert sedsoronként az első mérkőzés után leáll. Hozzá kell adnunk egy „g” -t a kifejezés végéhez, amint az alább látható, hogy globális keresést hajtsunk végre, így minden sorban az összes találat feldolgozásra kerül:

sed -n 's / nap / hét / gp' coleridge.txt

Ez megfelel az első sorban szereplő négyből hárman. Mivel az első szó „nap”, és seda kis- és nagybetűk megkülönböztetése, ezért nem tartja a példányt azonosnak a „nap” kifejezéssel.

A következőt írjuk be i , a kifejezés végén egy paranccsal hozzáadva a kis- és nagybetűk érzéketlenségét:

sed -n 's / nap / hét / gip' coleridge.txt

Ez működik, de nem biztos, hogy mindig be akarja kapcsolni a kis- és nagybetűket. Ezekben az esetekben egy regex csoport segítségével hozzáadhatja a minta-specifikus eset-érzéketlenséget.

Például, ha a karaktereket szögletes zárójelek közé tesszük ( []), akkor azokat „bármelyik karakterként értelmezzük ebből a karakterlistából”.

A következőket írjuk be, és a „D” és a „d” karaktereket beillesztjük a csoportba annak biztosítása érdekében, hogy azok egyezzenek a „Day” és a „Day” szóval:

sed -n 's / [Dd] ay / hét / gp' coleridge.txt

A helyettesítéseket a fájl egyes szakaszaira is korlátozhatjuk. Tegyük fel, hogy a fájlunk furcsa távolságot tartalmaz az első versben. A következő ismerős paranccsal láthatjuk az első verset:

sed -n '1,4p' coleridge.txt

Két szóközt keresünk, és helyettesítjük őket eggyel. Ezt globálisan fogjuk megtenni, így a művelet megismétlődik a teljes vonalon. Az egyértelműség kedvéért a keresési minta szóköz, szóköz ( *) és a helyettesítő karakterlánc egyetlen szóköz. A 1,4helyettesítést a fájl első négy sorára korlátozza.

Mindezt a következő parancsban állítottuk össze:

sed -n '1,4 s / * / / gp' coleridge.txt

Ez szépen működik! A keresési minta az, ami itt fontos. A csillag ( *) az előző karakter nulla vagy annál nagyobb részét jelenti, ami szóköz. Így a keresési minta egy vagy több szóköz karakterláncait keresi.

Ha egyetlen szókört helyettesítünk több szóköz bármely sorozatával, akkor a fájlt rendes térközre állítjuk vissza, minden szó között egyetlen szóköz van. Ez egyes esetekben egyetlen helyet is helyettesít egyetlen szóközzel, de ez semmit sem befolyásol hátrányosan - akkor is megkapjuk a kívánt eredményt.

Ha beírjuk a következőket, és a keresési mintát egyetlen szóközre csökkentjük, azonnal meglátja, miért kell két szóközt beillesztenünk:

sed -n '1,4 s / * / / gp' coleridge.txt

Mivel a csillag megegyezik az előző karakter nullával vagy annál többel, minden olyan karaktert, amely nem szóköz, „nulla szóköznek” tekinti, és a helyettesítést alkalmazza rá.

Ha azonban két szóközt is felveszünk a keresési mintába,  sedakkor legalább egy szóközt kell találnunk, mielőtt alkalmazná a helyettesítést. Ez biztosítja, hogy a nem szóköz karakterek érintetlenek maradjanak.

A következőket írjuk be a -ekorábban használt (kifejezés) használatával, amely lehetővé teszi számunkra, hogy egyszerre két vagy több helyettesítést végezzünk:

sed -n -e 's / motion / flutter / gip' -e 's / ocean / gutter / gip' coleridge.txt

Ugyanezt az eredményt érhetjük el, ha pontosvesszővel ( ;) választjuk el a két kifejezést, így:

sed -n 's / motion / flutter / gip; s / ocean / gutter / gip' coleridge.txt

Amikor a következő parancsban a „napot” a „hétre” cseréltük, akkor a „jól a nap” kifejezésben a „nap” példány is felcserélődött:

sed -n 's / [Dd] ay / hét / gp' coleridge.txt

Ennek megakadályozása érdekében csak olyan vonalakon próbálhatunk meg helyettesítést, amelyek megfelelnek egy másik mintának. Ha úgy módosítjuk a parancsot, hogy az elején legyen keresési minta, akkor csak az adott mintának megfelelő vonalakon történő működést vesszük figyelembe.

A következőket írjuk be, hogy az egyező mintánk az „utána” szó legyen:

sed -n '/ after / s / [Dd] ay / week / gp' coleridge.txt

Ez megadja a kívánt választ.

Összetettebb helyettesítések

Adjunk egy kis szünetet Coleridge-nek, és használjuk seda nevek kibontására a etc/passwdfájlból.

Ennek rövidebb módjai vannak (erről később), de a hosszabb utat itt egy másik koncepció bemutatására használjuk. A keresési mintában minden egyes egyeztetett elem (ún. Alkifejezések) számozható (legfeljebb kilenc elemig). Ezután felhasználhatja ezeket a számokat a  sedparancsokban a konkrét részkifejezések hivatkozására.

Ahhoz, ()hogy ez működjön , zárójelbe kell foglalnia az alkifejezést [ ]. A zárójeleket hátrafelé mutató perjelnek ( \) kell megelőznie, hogy megakadályozzák őket normál karakterként.

Ehhez írja be a következőket:

sed 's / \ ([^:] * \). * / \ 1 /' / etc / passwd

Bontjuk ezt le:

  • sed 's/: A sedparancs és a helyettesítő kifejezés kezdete.
  • \(: Az (alkifejezést körülvevő nyitó zárójel [ ], amelyet egy visszavonás ( \) előz meg .
  • [^:]*: A keresett kifejezés első alkifejezése szögletes zárójelben tartalmaz egy csoportot. A caret ( ^) jelentése „nem”, ha egy csoportban használják. A csoport azt jelenti, hogy minden karakter, amely nem kettőspont ( :), elfogadható egyezésként.
  • \): A záró zárójel [ )] egy megelőző visszavonással ( \).
  • .*: Ez a második keresési alkifejezés jelentése „bármilyen karakter és tetszőleges számuk”.
  • /\1: A kifejezés szubsztitúciós része tartalmaz 1egy visszavonást ( \). Ez azt a szöveget jelenti, amely megfelel az első részkifejezésnek.
  • /': A záró előre-perjel ( /) és egyetlen idézet ( ') befejezi a sedparancsot.

Ez mind azt jelenti, hogy minden olyan karakterláncot meg fogunk keresni, amely nem tartalmaz kettőspontot ( :), amely a megfelelő szöveg első példánya lesz. Ezután bármi mást keresünk azon a soron, ami a szöveg egyezésének második példánya lesz. A teljes sort lecseréljük az első részkifejezésnek megfelelő szövegre.

A /etc/passwdfájl minden sora kettőspontra végződő felhasználónévvel kezdődik. Mindent összevetünk az első kettősponttal, majd ezt az értéket behelyettesítjük az egész sorra. Szóval elkülönítettük a felhasználóneveket.

Ezután zárójelbe tesszük a második alkifejezést [ ()], így szám szerint is hivatkozhatunk rá. Majd azt is cserélni \1 az \2. A parancsunk most az egész sort helyettesíti az első kettősponttól ( :) a sor végéig.

A következőket írjuk be:

sed 's / \ ([^:] * \) \ (. * \) / \ 2 /' / etc / passwd

Ezek a kis változtatások megfordítják a parancs jelentését, és mindent megkapunk, kivéve a felhasználóneveket.

Most nézzük meg ennek gyors és egyszerű módját.

Keresési kifejezésünk az első kettősponttól ( :) a sor végéig tart. Mivel a helyettesítő kifejezésünk üres ( //), nem helyettesítjük az egyező szöveget semmivel.

Tehát a következőket írjuk be, levágva mindent az első kettősponttól ( :) a sor végéig, csak a felhasználóneveket hagyva:

sed 's /:.*// "/ etc / passwd

Nézzünk meg egy példát, amelyben az első és a második egyezésre hivatkozunk ugyanabban a parancsban.

Van egy vesszőfájl ( ,), amely elválasztja az utó- és a vezetékneveket. "Vezetéknév, keresztnév" néven szeretnénk felsorolni őket. Az  catalábbiak szerint megnézhetjük, mi van a fájlban:

macska geeks.txt

Mint sok sedparancs, ez a következő is először áthatolhatatlannak tűnhet:

sed 's / ^ \ (. * \), \ (. * \) $ / \ 2, \ 1 / g' geeks.txt

Ez egy helyettesítési parancs, mint a többi általunk használt, és a keresési minta meglehetősen egyszerű. Az alábbiakban részletezzük:

  • sed 's/: A normál helyettesítési parancs.
  • ^: Mivel az ügyvezető nem tartozik egy csoportba ( []), ez azt jelenti, hogy „a sor kezdete”.
  • \(.*\),: Az első részkifejezés tetszőleges számú karakter. Zárójelbe van zárva [ ()], amelyek mindegyikét egy hátsó perjel ( \) előzi meg, így szám szerint hivatkozhatunk rá. Eddigi teljes keresési mintánk a sor elejétől kezdve az első vesszőig ( ,) tetszőleges számú karakterre utal.
  • \(.*\):  A következő alkifejezés (ismét) tetszőleges számú karakter. Zárójelekbe is zárva van [ ()], mindkettőt egy visszavonás ( \) előzi meg, így szám szerint hivatkozhatunk az egyező szövegre.
  • $/: A dollárjel ( $) a sor végét jelenti, és lehetővé teszi a keresés folytatását a sor végéig. Ezt egyszerűen a dollárjel bevezetésére használtuk. Itt nem igazán van rá szükség, mivel a csillag ( *) ebben a forgatókönyvben a sor végére kerülne. Az előre mutató perjel ( /) befejezi a keresési minta szakaszt.
  • \2,\1 /g': Mivel két alkifejezésünket zárójelbe tettük, számukra hivatkozhatunk mindkettőjükre. Mivel meg akarjuk változtatni a sorrendet, ezeket gépeljük be second-match,first-match. A számokat visszafelé ( \) kell megelőzni .
  • /g: Ez lehetővé teszi a parancsunk számára, hogy globálisan működjön az egyes sorokon.
  • geeks.txt: A fájl, amin dolgozunk.

Használhatja a Cut parancsot ( c) a keresési mintának megfelelő egész sorok helyettesítésére is. A következőket írjuk be, hogy keressünk egy sort a „nyak” szóval, és helyettesítsük egy új szövegsorral:

sed '/ nyak / c A csuklóm körül felfűzték' coleridge.txt

Új sorunk most a kivonatunk alján jelenik meg.

Vonalak és szöveg beszúrása

Új sorokat és szöveget is beszúrhatunk a fájlunkba. Ha új sorokat szeretne illeszteni a megfelelő sorok után, akkor az Append parancsot ( a) fogjuk használni .

Itt van a fájl, amellyel dolgozni fogunk:

macska geeks.txt

Megszámoztuk a sorokat, hogy ez egy kicsit könnyebben követhető legyen.

A következőket írjuk be a „He” szót tartalmazó sorok kereséséhez, és egy új sort illesztünk alá:

sed '/ He / a -> beszúrva!' geeks.txt

Az alábbiakat írjuk be, és az Insert parancsot ( i) is beillesztjük az új sor beszúrására a megfelelő szöveget tartalmazó sorok fölé:

sed '/ He / i -> beszúrva!' geeks.txt

Az &eredeti egyező szöveget képviselő ampersand ( ) segítségével új szöveget adhatunk hozzá a megfelelő sorhoz. \1 ,  \2és így tovább, egyező részkifejezéseket jelentenek.

Szöveg hozzáadásához a sor elejéhez egy helyettesítő parancsot használunk, amely megegyezik a sor mindenével, egy helyettesítő záradékkal kombinálva, amely egyesíti új szövegünket az eredeti sorral.

Ehhez írja be a következőket:

sed 's /.*/--> A & /' geeks.txt beillesztése

A következőt írjuk be, beleértve a Gparancsot is, amely egy üres sort ad az egyes sorok közé:

sed 'G' geeks.txt

Ha két vagy több üres sort szeretne hozzáadni, használhatja a G;GG;G;Gstb.

Sorok törlése

A Törlés parancs ( d) törli azokat a sorokat, amelyek megfelelnek a keresési mintának, vagy azokat, amelyeket sorszámokkal vagy tartományokkal adtak meg.

Például a harmadik sor törléséhez a következőket írjuk be:

sed '3d' geeks.txt

A négy és öt közötti sorok törléséhez a következőket írjuk be:

sed '4,5d' geeks.txt

A tartományon kívüli vonalak törléséhez felkiáltójelet ( !) használunk , az alábbiak szerint:

sed '6,7! d' geeks.txt

A változtatások mentése

Eddig minden eredményünket kinyomtatták a terminál ablakába, de még nem mentettük sehova. Ezek állandóvá tételéhez írhatja a módosításokat az eredeti fájlba, vagy átirányíthatja őket egy új fájlba.

Az eredeti fájl felülírása némi óvatosságot igényel. Ha a sedparancsod helytelen, akkor az eredeti fájlban néhány olyan változtatást végezhet, amelyet nehéz visszavonni.

Bizonyos nyugalom érdekében sed készíthet biztonsági másolatot az eredeti fájlról, mielőtt végrehajtja a parancsát.

A Helyben opció ( -i)  használatával megadhatja, sedhogy írja-e az eredeti fájl módosításait, de ha fájlkiterjesztést ad hozzá, sed akkor az eredeti fájlt biztonsági másolattal látja el. Ugyanaz a neve lesz, mint az eredeti fájl, de új fájlkiterjesztéssel.

A bemutatáshoz megkeressük azokat a sorokat, amelyek tartalmazzák az „Ő” szót, és töröljük azokat. Az eredeti fájlunkat egy új fájlra is biztonsági másolatot készítjük a BAK kiterjesztés használatával.

Ehhez írja be a következőket:

sed -i'.bak '' /^.*He.*$/d 'geeks.txt

A következőt gépeljük be, hogy megbizonyosodjunk arról, hogy a biztonsági másolat fájlunk nem változott-e:

macska geeks.txt.bak

A következőket beírhatjuk a kimenet új fájlba történő átirányításához és hasonló eredmény eléréséhez:

sed -i'.bak '' /^.*He.*$/d 'geeks.txt> new_geeks.txt

Használjuk cat, hogy erősítse meg a változtatásokat írtak az új fájlt, az alábbiak szerint:

macska new_geeks.txt

Miután mindent elcsábítottam

Mint valószínűleg észrevette, még ez a gyors alapozó sedis elég hosszú. Sokat tartalmaz ez a parancs, és még többet tehet vele.

Remélhetőleg ezek az alapfogalmak szilárd alapot nyújtottak, amelyre építve tovább tanulhat.