A Linux „sed” parancsa a stream editor rövidítése. Adatfolyamok (fájlok) reguláris kifejezésekkel történő szerkesztésére szolgál. De ez a szerkesztés nem végleges. Csak a kijelzőn marad, de a tényleges fájltartalom ugyanaz marad.
Elsősorban szöveghelyettesítésre szolgál; Ezenkívül más szövegkezelési műveletekhez is használható, mint például beszúrás, törlés, keresés stb. A sed parancs lehetővé teszi a fájlok szerkesztését azok megnyitása nélkül. A reguláris kifejezések támogatása hatékonyabb szövegmanipulációs eszközzé teszi.
A sed parancs áttekintése
Ez egy Unix segédprogram, amely egy kompakt és egyszerű programozási nyelv segítségével átalakítja és elemzi a szöveget. 1973 és 1974 között Lee E. McMahon, a Bell Labstól integrálta, és ma szinte minden operációs rendszerben jelen van. A sed parancs a korábbi qed (gyorsszerkesztő) és az ed interaktív szerkesztő szkriptelési szempontjain alapult. Ez volt a legkorábbi eszköz a reguláris kifejezések támogatására, és továbbra is aktív marad a szövegfeldolgozásnál, ami a legfontosabb a helyettesítési paranccsal. A híres alternatív eszközök közé tartozik a Perl és az AWK for 'folyam szerkesztés' és egyszerű szöveges karakterlánc-manipuláció.
A sed parancs működési módja
A sed parancs egy szövegfeldolgozó sororientált segédprogram: soronként olvassa be a szöveget egy fájlból vagy bemeneti adatfolyamból egy belső pufferbe, amelyet mintatérként ismerünk. Minden sorolvasás ciklust kezd. A sed parancs egy vagy több műveletet használ, amelyeket egy sed parancsfájl ír le a mintatérben. A programozási nyelvet körülbelül 25 paranccsal működteti, amelyek leírják a szöveg feletti műveleteket.
Az összes bemeneti sor esetében a sed parancs rendszerint a mintateret eredményezi, és a parancsfájl végrehajtása után a ciklust a következő sorral kezdi újra. Más szkriptvég-természetek is elérhetők a parancsfájl-parancsokból és a beállítási lehetőségekből, például az N a következő sor azonnali mintatérbe való felvételéhez, a q a kilépéshez, a d a mintaterület eltávolításához stb. Ennélfogva a sed szkript egy olyan huroktörzsre vonatkozik, amely egy áramvonalból iterál, amelyben a ciklusváltozót és magát a ciklust a sed tartja fenn és implicite.
- A sed szkript leírható a parancssorban, vagy beolvasható egy elszigetelt fájlon keresztül. A sed parancsfájlban a parancsok extra címet vehetnek fel reguláris kifejezések vagy sorszámok kontextusában. A cím dönti el, hogy mikor kerül végrehajtásra a parancs. Például a 2d csak a d (vagy törlés) parancsot hajtja végre a 2. bemeneti sorban, míg a /^ /d minden szóközzel kezdődő sort eltávolít.
- A tartási területet, egy elkülönített speciális puffert egyes sed parancsok használhatják felhalmozódó szövegek tárolására a ciklusok között. A sed parancsnyelvének csak két változója van (mintatér és tartási szóköz), valamint GOTO-szerű elágazási funkció. A nyelv azonban Turing-teljes. Ezoterikus sed szkriptek elérhetők számos játékhoz, például tetrishez, sakkhoz, arkanoidhoz és sokobanhoz.
- A fő hurok a bemeneti adatfolyam összes sorára fut, és a bemenet minden sorában ellenőrzi a sed parancsfájlt. A sed script sorok mind egy minta-művelet pár, amely azt jelzi, hogy milyen mintát kell egyeztetni, és melyik műveletet kell végrehajtani, amely feltételes utasításként másolható. Az alapértelmezett műveletek (mintatér nyomtatása, sor másolása a mintatérbe), bemeneti és kimeneti adatfolyamok, valamint munkaváltozók (tartási tér és mintaterület) implicitek; a főhurok miatt lehetséges tömör egysoros programokat megadni.
A sed parancs használata
- A pont (^) megegyezik a sor kezdetével.
- A dollár szimbólum ($) megegyezik a sor befejezésével.
- A csillag (*) ugyanaz, mint a több vagy nulla korábbi karakter előfordulása.
- A plusz szimbólum (+) ugyanaz, mint az egy vagy több korábbi karakter előfordulása.
- A kérdőjel (?) ugyanaz, mint a több vagy nulla korábbi karakter előfordulása.
- A pont szimbólum (.) pontosan ugyanaz, mint egy karakter.
Az alábbi példa a sed parancs legjellemzőbb parancsát és tipikus használatát, azaz a helyettesítést mutatja be. A használat volt a tényleges motiváció a sed parancshoz:
sed 's/regexp/replacement/g' inputFileName > outputFileName
Más módok is lehetségesek az egyszerű feldolgozáshoz mintegy 25 sed paranccsal. Az alábbiakban például a d opciót használja a csak szóközt és sorkaraktervéget tartalmazó sorok kiszűrésére:
sed '/^ *$/d' inputFileName
A fenti példa az alábbi reguláris kifejezés metakarakterei közül néhányat használ:
Gyakran a sed parancsot szűrőként használják egy Unix alatti folyamatban:
$generateData | sed 's/x/y/g'
A generateData program adatokat generál, a sed parancs pedig egy kis változtatást hajt végre úgy, hogy x-et cserél y helyett.
Gyakran hasznos, ha sok sed parancsot, soronként egy parancsot helyez el egy szkriptfájlba, és használja az -f kapcsolót a parancsok végrehajtásához a fájlból:
sed -f subst.sed inputFileName > outputFileName
Szintaxis:
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
Lehetőségek:
Íme néhány parancssori opció a sed parancshoz:
-n, --csendes, --néma: Erőteljesen lehetővé teszi számunkra, hogy kinyomtassuk a mintateret.
-e script, --expression=script: A parancsfájl hozzáadására szolgál a végrehajtandó parancsokhoz.
-f script-file, --file=script-file: A parancsfájl tartalmának hozzáadására szolgál a végrehajtandó parancsokhoz.
--follow-symlinks: a szimbolikus hivatkozások követésére szolgál a helyben történő feldolgozás során.
latex asztal
-i[SUFFIX], --in-place[=SUFFIX]: a fájlok helyben történő szerkesztésére szolgál (biztonsági mentést készít, ha a SUFFIX opció rendelkezésre áll).
-l N, --vonal-hossz=N: Az 'l' parancs kívánt sortörési hosszának megadására szolgál.
--posix: az összes GNU kiterjesztés letiltására szolgál.
-E, -r, --regexp-extended: Lehetővé teszi a kiterjesztett reguláris kifejezések használatát a szkriptben (a hordozhatóság érdekében használja a POSIX -E-t).
-s, --külön: Ez arra szolgál, hogy a fájlokat különállónak tekintse, nem pedig egyesnek, és folytatja a hosszú adatfolyamot.
--homokozó: Sandbox módban történő működésre szolgál.
-u, --puffereletlen: A minimális adatmennyiség betöltésére szolgál a bemeneti fájlokból, és gyakrabban üríti ki a kimeneti puffereket.
-z, --null-data: A sorok NUL karakterekkel történő elválasztására szolgál.
--Segítség: a súgó kézikönyv megjelenítésére szolgál.
--változat: A verzióinformációk megjelenítésére szolgál.
Példák a sed parancsra
Lássuk a következő példákat:
- Jelentkezés az STDIN könyvtárba
- Globális csere
- Vonal eltávolítása
- A Multiple sed parancs használata
- Parancsok olvasása fájlból
- Karakterek cseréje
- A sed korlátozása
- Szöveg beszúrása és hozzáfűzése
- Sorok módosítása
- A karakterek transzformációja
- A sorszámok kinyomtatása
Jelentkezés az STDIN könyvtárba
A sed parancs nem csak a fájlok kezelésére korlátozódik; Alkalmazhatjuk az STDIN könyvtárra is.
echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/'
A fenti parancsok az első szöveget a második szövegmintára cserélik. Vegye figyelembe az alábbi kimenetet:
A fenti kimenetből először végrehajtottuk a 'sed' parancsot egy 'class7' karakterláncon, ahol a 'class' változót 'jtp'-re, a 7-et pedig 10-re változtattuk. Ezután végrehajtottuk a 'sed' parancsot az 'msg.txt' adatfolyamon. ' ahol a „tanulás” szó „tanulmányozásra” alakul át.
Globális csere
A korábbi példában az összes „tanulni” szó nem volt „tanulmányozásra” szerkesztve. Minden szó szerkesztéséhez globális 'g' helyettesítőt kell használnunk. Szerkeszti az összes megadott szót egy fájlban vagy karakterláncban.
Szintaxis:
command | sed 's///g'
Tekintsük az alábbi példákat:
echo class7 class9 | sed 's/class/jtp/g' cat msg.txt | sed 's/learn/study/g'
A fenti parancsok lecserélik az összes megadott szövegmintát. Vegye figyelembe az alábbi kimenetet:
A fenti kimenetből az 'echo class7 class9 |. parancs végrehajtásával sed 's/class/jtp/g'' az összes 'osztály' 'jtp'-vé alakul, és a 'cat msg.txt' paranccsal | sed 's/learn/study/g'' az összes 'learn'-t 'study'-ra alakították át.
Vonal eltávolítása
A „d” opció lehetővé teszi, hogy egy teljes sort eltávolítsunk a fájlból. Csak egy szót kell megadnunk ebből a sorból a 'd' opcióval, és ez a sor törlődik. De vegye figyelembe, hogy az azonos szót tartalmazó összes sor törlődik. A következőképpen kerül végrehajtásra:
cat | sed '//d'
Fontolja meg az alábbi parancsot:
cat msg.txt | sed '/jtp/d'
A fenti parancs törli a „jtp” szót tartalmazó sorokat. Vegye figyelembe az alábbi kimenetet:
A fenti kimenetből a 'cat msg.txt | parancs végrehajtásával sed '/jtp/d' minden, a 'jtp' szót tartalmazó sor törlésre kerül.
A Multiple sed parancs használata
Az '-e' opció lehetővé teszi, hogy egyszerre több sed parancsot hajtsunk végre. Egynél több sed műveletet hajthatunk végre a parancs végrehajtásával:
sed -e ' ; '
Fontolja meg az alábbi parancsot:
hány hónap a q3
sed -e 's/red/blue/; s/yellow/black/' exm.txt
A fenti parancs az „exm.txt” fájlban megadott összes műveletet alkalmazza. Vegye figyelembe az alábbi kimenetet:
Amint a fenti kimenetből láthatjuk, az összes „piros” szót „kék”-re, a „sárga” szót pedig „feketére” cseréljük. Az alábbi parancsokat is elkülöníthetjük:
sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt
Az eredmény ugyanaz lesz, mint a fenti parancs.
Parancsok olvasása fájlból
A sed parancsokat fájlba menthetjük, és bármelyik fájlban egyszerre alkalmazhatjuk. Ezt a '-f' opció megadásával lehet megtenni a következőképpen:
sed -f
A fenti parancsból a '' olyan fájl, amely sed parancslistával rendelkezik. Fontolja meg az alábbi parancsot:
sed -f SedCommands exm.txt
A fenti parancs az 'exm.txt' 'SedCommand' fájljában található összes parancsot alkalmazza. Vegye figyelembe az alábbi kimenetet:
A fenti kimenetből a korábbi példában alkalmazott parancsokat használtuk. Tehát a kimenet ugyanaz, mint az előző példában.
Karakterek cseréje
A felkiáltójelet (!) használhatjuk karakterlánchatárolóként. Például le akarjuk cserélni a bash shell-t, és lecseréljük csh shellre az '/etc/passwd'-ben. Ehhez hajtsa végre az alábbi parancsot:
sed 's//bin/bash//bin/csh/' /etc/passwd
Ugyanezt az eredményt érhetjük el az alábbi parancs végrehajtásával:
sed 's!/bin/bash!/bin/csh!' /etc/passwd
A sed korlátozása
A sed parancs alapvető használata a teljes fájlt feldolgozza. De korlátozhatjuk a sed parancsot, és bármilyen sort megadhatunk. A sed parancs korlátozásának két módja van:
- Sorok sora.
- Egy adott vonalhoz illő minta.
Megadhatunk egy számot a sor meghatározásához az alábbiak szerint:
sed '3s/Red/Blue/' exm.txt
A fenti parancs a megadott műveletet alkalmazza a harmadik sorban. Vegye figyelembe az alábbi kimenetet:
A fenti kimenetből csak a harmadik sor módosul.
Megadhatunk egy sor tartományt is. A sorok tartományának megadásához hajtsa végre a parancsot a következőképpen:
sed '1,3s/Red/Blue/' exm.txt
A fenti parancs frissíti az 1. és 3. sorban megadott szöveget. Vegye figyelembe az alábbi kimenetet:
Szöveg beszúrása és hozzáfűzése
Az „i” és „a” jelző a szöveg beszúrására és hozzáfűzésére szolgál. Az „i” jelző hozzáadja a szöveget a karakterlánc elé, az „a” jelző pedig a karakterlánc utáni szöveg hozzáadására szolgál. Fontolja meg az alábbi parancsot:
echo 'Another Demo' | sed 'iFirst Demo'
A fenti parancs beszúrja a szöveget az „Another Demo” szöveg elé. Vegye figyelembe az alábbi kimenetet:
Szöveg hozzáfűzéséhez hajtsa végre a parancsot a következőképpen:
echo 'Another Demo' | sed 'aFirst Demo'
A fenti parancs hozzáfűzi a szöveget. Vegye figyelembe az alábbi kimenetet:
Vonalak módosítása
A „c” jelző egy adott sor módosítására szolgál. Egy sor módosításához hajtsa végre a parancsot a következőképpen:
sed '3cThis is a modified line.' exm.txt
A fenti parancs frissíti a harmadik sort. Vegye figyelembe az alábbi kimenetet:
Használhatunk reguláris kifejezést egynél több azonos mintázatú sor frissítésére is. Fontolja meg az alábbi parancsot:
sed '/Apple is /c Line updated.' exm.txt
A fenti parancs frissíti az összes olyan sort, amelyben az „Apple is” karakterlánc szerepel. Vegye figyelembe az alábbi kimenetet:
A karakterek transzformációja
Az 'y' zászló a karakterek átalakítására szolgál. A karakterek átalakítása nem korlátozható konkrét előfordulásokra. Karakterek átalakításához hajtsa végre a következő parancsot:
sed 'y/abc/def/' exm.txt
A fenti parancs az 'a', 'b', 'c' karaktereket 'd', 'e', 'f' karakterré alakítja. vegye figyelembe az alábbi kimenetet:
A sorszámok kinyomtatása
Az '=' jel a sorszám kinyomtatására szolgál. A sorszám kinyomtatásához hajtsa végre a következő parancsot:
sed '=' exm.txt
A fenti parancs megjeleníti a fájltartalom sorszámát. Vegye figyelembe az alábbi kimenetet:
Az egyenlőségjel az '-n' opcióval a megfelelő szkriptet tartalmazó sor számát határozza meg. Vegye figyelembe az alábbi kimenetet:
sed -n '/mango/=' exm.txt
A fenti parancs megjeleníti a „mango” szót tartalmazó sor számát. Vegye figyelembe az alábbi kimenetet:
A fenti kimenetből láthatjuk, hogy a 2-es sor a „mango” szót tartalmazza.