Ablakok.  Vírusok.  Jegyzetfüzetek.  Internet.  hivatal.  Segédprogramok.  Drivers


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

Nikolai Ignatushko ellenőrizte a GNU sed 4.2.1-es verzióját Gentoo forgalmazása a cikkben említett összes parancsot. Nem minden szkript működött jól a sed GNU verzióján. De az eset azokra az apróságokra vonatkozott, amelyeket kijavítottak. Csak a domb hegyekkel való helyettesítésének forgatókönyvét kellett jelentősen átdolgozni.

1. Bemutatkozás

Üdvözöljük sorozatunk második részében a sed-en, a GNU verzióban. A sed 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” és a „stream” szó jelentése ez az eset jelenthet fájlt, csövet vagy csak stdin-t. 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 cikk terjedelme nem teszi lehetővé a belefoglalást teljes útmutató a reguláris kifejezéseken ehelyett az alapfogalmakat hangozzuk, és megadjuk nagyszámú példák a sed használatára.

2. Telepítés

Itt nincs sok mondanivaló. Valószínűleg már telepítve van a sed, mivel különféle rendszerszkriptek használják, valamint Linux felhasználók akik javítani akarnak teljesítményükön. 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, plusz hivatkozásokat a következőre kezdőlap programokat é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 „stream editor” nem mond sokat 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. Ezek a műveletek hozzáadhatók, beszúrhatók, törölhetők vagy cserélhetők. 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 folytatnánk az útmutatót, 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 (scriptek) 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. Amikor az ember meg akarja érteni, hogy mi is ő reguláris kifejezések, kulcsszó egy "egyezés", pontosabban "egyezési minta". 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 vette át a helyét, így most le kell cserélnie a Nick szót Johnra. 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 szemléltettünk néhány pontot: megkeressük a „Nick” minta összes egyezését, és mindegyiket „John”-ra cseréljük. Ne feledje, hogy a sed a kis- és nagybetűkre érzékeny keresést végez, ezért legyen óvatos, és ellenőrizze a kimeneti fájlt, hogy megbizonyosodjon arról, hogy minden helyettesítés megtörtént. A fenti példát így is felírhatjuk:

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

Oké, azt mondod, de hol vannak itt a reguláris kifejezések? Igen, először példát akartunk mutatni, és most kezdődik a legérdekesebb rész.
Ha nem biztos benne, hogy "nick" vagy "Nick" írta, és mindkét esetet le akarja fedni, akkor a sed "s/Nick|nick/John/g" parancsot kell használnia. A függőleges sávnak van egy jelentése, amit tudnod kell, ha tanultad a C nyelvet, vagyis a kifejezésed 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ése ugyanaz. A reguláris kifejezésekben gyakran használt egyéb operátorok a "?", amely az előző karakter nulla vagy egy ismétlődését egyezik meg (azaz a flavou?r megegyezik az ízzel és az ízzel), a "*" nulla vagy többször, a "+" egy vagy több alkalommal. A "^" a sor elejére egyezik, a "$" pedig fordítva. Ha Ön vim vagy vim felhasználó, sok dolog ismerősnek fog tűnni. Végül is ezeknek a segédprogramoknak az awk-val és a C-vel együtt gyökerei a UNIX korai időszakában vannak. Erről most nem is beszélünk, mert példákkal könnyebb megérteni ezeknek a karaktereknek a jelentését, de tudnod 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 kifejezések különféle megvalósításai. , ami garantálja a fejfájást.

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

Kinyomtatja 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

A teljes file.txt fájlt kinyomtatja, 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

Törli 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 "lemez" sor van, akkor az elsőig törli.

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

Az egyiket az unos kis- és nagybetűk közötti különbséggel helyettesíti, így az "unos TWO" lesz kinyomtatva

Sed "G;G" file.txt

Kettőt szúr be üres sorok a file.txt minden sora után

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

A dos2unix lecserélésének módja :). Általában törli 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 karakterlánc első előfordulásakor.

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

A foo szót bar-ra cseréli csak a karakterlánc 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

Az összes egymást követő üres sort tömörítse 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 fordított perjelre végződik, csatlakoztassa a következőhöz (shell szkripteknél hasznos)

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

A szabályos kifejezést tartalmazó sor után 5 sort nyomtat

Sed "1~3d" file.txt

Töröljön minden harmadik sort, az elsővel 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 sajátodat?

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

Kinyomtatja az első RE (reguláris kifejezés) egyezésű karakterláncot

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

Törli az első egyezésű sort

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

Csak az első meccsen változik

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; :loop s/| *\([^",|][^,|]*\) *, */|\1|/g; s/| *, */||/g; t ciklus s/ *|/|/g ;s/|*/|/g;s/^|\(.*\)|$/\1/;

Egy sed-szkript a CSV-fájlok olyan fájllá konvertálásához, amely függőleges sávot tartalmaz elválasztóként (csak bizonyos CSV-típusokkal működik, beágyazott idézőjelekkel és vesszőkkel).

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.20s/Johnson/White/g" file.txt

Csak az 1-20. sorban változtatja meg Johnsont White-ra.

Sed "1,20 !s/Johnson/White/g" file.txt

Az előző példa fordított (mindent lecserél, 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-ig

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

Csak akkor nyomtat egy bekezdést, ha az tartalmaz egy 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 a foo utolsó egyezését cseréli le egy 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 Command 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" fájl.txt

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

Sed "/regexp/!d" file.txt

grep megfelelője

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

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

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

A reguláris kifejezés első egyezése utáni sort nyomtatja ki, de magát az egyezést nem tartalmazza.

sed "/pattern/d" fájl.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 sorra tömöríti. Egyetlen üres sor nem módosul.

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

Törli az egyes bekezdések utolsó sorát
Lekéri az e-mail fejlécét. Más szóval - mindent töröl az első üres sor után.

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

1. Bemutatkozás

Üdvözöljük sorozatunk második részében a sed-en, a GNU verzióban. A sed 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" (folyam) szó ebben az esetben fájlt, csövet 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. Ez a cikk nem elég nagy ahhoz, hogy egy teljes útmutatót tartalmazzon a reguláris kifejezésekről, ehelyett az alapvető fogalmakat ismertetjük, és sok példát adunk a sed használatára.

2. Telepítés

Itt nincs sok mondanivaló. Valószínűleg már telepítve van a sed, mivel azt különféle rendszerszkriptek, valamint a hatékonyságukat 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 „stream editor” nem mond sokat 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. Ezek a műveletek hozzáadhatók, beszúrhatók, törölhetők vagy cserélhetők. 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 folytatnánk az útmutatót, 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 (scriptek) 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ó a „match”, pontosabban a „match pattern”. 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 vette át a helyét, így most le kell cserélnie a Nick szót Johnra. 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 szemléltettünk néhány pontot: megkeressük a „Nick” minta összes egyezését, és mindegyiket „John”-ra cseréljük. Ne feledje, hogy a sed a kis- és nagybetűkre érzékeny keresést végez, ezért legyen óvatos, és ellenőrizze a kimeneti fájlt, hogy megbizonyosodjon arról, hogy minden helyettesítés megtörtént. A fenti példát így is felírhatjuk:

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

Oké, azt mondod, de hol vannak itt a reguláris kifejezések? Igen, először példát akartunk mutatni, és most kezdődik a legérdekesebb rész.
Ha nem biztos abban, hogy "nick" vagy "Nick"-t írt, és mindkét esetet kezelni szeretné, használja a sed "s/Nick/nick/John/g" parancsot. A függőleges sávnak van egy jelentése, amit tudnod kell, ha tanultad a C nyelvet, vagyis a kifejezésed 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ése ugyanaz. A reguláris kifejezésekben gyakran használt egyéb operátorok a "?", amely az előző karakter nulla vagy egy ismétlődését egyezik meg (azaz a flavou?r megegyezik az ízzel és az ízzel), a "*" nulla vagy többször, a "+" egy vagy több alkalommal. A "^" a sor elejére egyezik, a "$" pedig fordítva. Ha Ön vim vagy vim felhasználó, sok dolog ismerősnek fog tűnni. Végül is ezeknek a segédprogramoknak az awk-val és a C-vel együtt gyökerei a UNIX korai időszakában vannak. Erről most nem is beszélünk, mert példákkal könnyebb megérteni ezeknek a karaktereknek a jelentését, de tudnod 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 kifejezések különféle megvalósításai. , ami garantálja a fejfájást.

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 \
pay/p" myfile
Kiad egy bekezdést, amely a „Természetesen” szóval kezdődik, és a „figyelem, amit fizet” kifejezéssel végződik.
sed -n 12.18p fájl.txt Csak a file.txt 12-18. sorát adja ki
sed12,18d fájl.txt A teljes file.txt fájlt kinyomtatja, kivéve a 12–18. sorokat
sed G fájl.txt Megduplázza a szóközöket a file.txt fájlban
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" fájl.txt Törli az utolsó sort
sed "/\(3\)/p" fájl.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,/lemez/d" file.txt Törli az összes sort a 17. sortól a "lemezig"
echo ONE TWO / sed "s/one/unos/I" Az egyiket az unos kis- és nagybetűk közötti különbséggel helyettesíti, így az "unos TWO" lesz kinyomtatva
sed "G;G" file.txt Három szóköz egy fájlban
sed "s/.$//" file.txt dos2unix csere módja :)
sed "s/^[ ^t]*//" fájl.txt Eltávolítja az összes szóközt a file.txt sorai előtt
sed "s/[ ^t]*$//" file.txt Eltávolítja az összes szóközt a file.txt minden sorának végéről
sed "s/^[ ^t]*//;s/[ ^]*$//" file.txt Eltávolítja az összes szóközt a file.txt minden sorának elejéről és végéről
sed "s/foo/bar/" file.txt A foo szót bar-ra cseréli csak a karakterlánc első előfordulásakor.
sed "s/foo/bar/4" file.txt A foo szót bar-ra cseréli csak a karakterlánc 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" fájl.txt Törölje az összes egymást követő üres sort, kivéve az EOF-t
sed "/^$/N;/\n$/D" file.txt Törölje az összes egymást követő üres sort, de a felső sort hagyja üresen.
sed "/./,$!d" fájl.txt Távolítsa el az összes vezető üres sort
sed -e:a -e "/^\n*$/($d;N;);/\n$/ba" \
fájl.txt
Távolítsa el az összes utolsó üres sort
sed -e:a -e "/\\$/N; s/\\\n//; ta" \
fájl.txt
Ha egy fájl fordított perjelre végződik, csatlakoztassa a következőhöz (shell szkripteknél hasznos)
sed "/regex/,+5/expr/" Megfelel a reguláris kifejezésnek és a következő 5 sornak
sed "1~3d" file.txt Töröljön minden harmadik sort, az elsővel kezdve.
sed -n "2~5p" fájl.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 sajátodat?
sed -n "/RE/(p;q;)" fájl.txt Csak az RE (reguláris kifejezés) első egyezését nyomtatja ki
sed "0,/RE/(//d;)" fájl.txt Csak az első egyezést távolítja el
sed "0,/RE/s//to_that/" file.txt Csak az első meccsen változik
sed "s/^[^,]*,/9999,/" file.csv Az első mezőt 9999-re módosítja a CSV-fájlban
s/^ *\(.*[^ ]\) *$//\1//; s/"*, */"//g; : ciklus s// *\([^",/][^,/]*\) *, *//\1//g; s// *, *//\1//g; t ciklus s / *////g;s// *///g;s/^/\(.*\)/$/\1/; Egy sed-szkript a CSV-fájlok olyan fájllá konvertálásához, amely függőleges sávot tartalmaz elválasztóként (csak bizonyos CSV-típusokkal működik, beágyazott idézőjelekkel és vesszőkkel).
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.20s/Johnson/White/g" file.txt Csak az 1-20. sorban változtatja meg Johnsont White-ra.
sed "1,20 !s/Johnson/White/g" file.txt Az előző példa fordított (mindent lecserél, kivéve az 1-20. sorokat)
sed "/from/,/amig/ ( s/\ /magenta/g; \ s/\ /cyan/g; )" file.txt Csak a "tól" és az "amíg" között helyettesíti
sed "/ENDNOTES:/,$ ( s/Schaff/Herzog/g; \ s/Kraft/Ebbing/g; )" file.txt Csak az "ENDNOTES:" szót helyettesíti az EOF-ig
sed "/./(H;$!d;);x;/regex/!d" fájl.txt Csak akkor nyomtat egy bekezdést, ha az tartalmaz egy szabályos kifejezést
sed -e "/./(H;$!d;)" -e "x;/RE1/!d;/RE2/!d;/RE3/!d" fájl.txt Csak akkor nyomtasson bekezdéseket, ha azok tartalmazzák az RE1-et, RE2-t és az RE3-at
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 a foo utolsó egyezését cseréli le bárra
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 fájl.txt A fej parancs cseréje
sed -e:a -e "$q;N;11,$D;ba" \ file.txt A farok parancs cseréje
sed "$!N; /^\(.*\)\n\1$/!P; D" \ fájl.txt Az uniq Command 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" fájl.txt Egyenértékű a farok -n 2-vel
sed -n "$p" fájl.txt ... farok -n 1 (vagy farok -1)
sed "/regexp/!d" fájl.txt grep megfelelője
sed -n "/regexp/(g;1!p;);h" fájl.txt Kinyomtatja a reguláris kifejezés első egyezése előtti sort, de magát az egyezést nem tartalmazza.
sed -n "/regexp/(n;p;)" fájl.txt A reguláris kifejezés első egyezése utáni sort nyomtatja ki, de magát az egyezést nem tartalmazza.
sed "/pattern/d" fájl.txt Eltávolítja a mintának megfelelő vonalakat
sed "/./!d" fájl.txt Eltávolítja az összes üres sort a fájlból
sed "/^$/N;/\n$/N;//D" file.txt Törli az összes egymást követő üres sort, kivéve az első kettőt
sed -n "/^$/(p;h;);/./(x;/./p;)"\ file.txt Törli az egyes bekezdések utolsó sorát
sed "/^$/q" Lekéri az e-mail fejlécét
"1,/^$/d" Megkapja az üzenet törzsét
sed "/^Tárgy: */!d; s///;q" Lekéri az e-mail tárgyát
sed "s/^/> /" Idéz egy üzenetet a "> " karakter beszúrásával minden sor elé
sed "s/^> //" Fordított parancs (eltávolítja az idézetet az üzenetből)
sed -e:a -e "s/<[^>]*>//g;/ Eltávolítja a HTML címkéket
sed "/./(H;d;);x;s/\n/=(NL)=/g" file.txt / sort \ / sed "1s/=(NL)=//;s/=( NL)=/\n/g" A file.txt bekezdéseit ábécé szerint rendezi
sed "s@/usr/bin@&/ [e-mail védett]"útvonal.txt A /usr/bin lecseréli a /usr/bin/local fájlt a path.txt fájlban
sed "s@^.*$@<<<&>>>@g"path.txt Próbáld ki és meglátod :)
sed "s/\(\/[^:]*\).*/\1/g" path.txt Feltéve, hogy a path.txt tartalmazza a $PATH-t, minden sorba csak az első elérési utat írja ki
sed "s/\([^:]*\).*/\1/" /etc/passwd awk csere - csak a passwd fájlból jelenítse meg a felhasználókat
echo "Welcome To The Geek Stuff" / sed \ "s/\(\b\)/\(\1\)/g" (W)welcome (T)o (T)he (G)eek (S)tuff Magyarázat nélkül is érthető
sed -e "/^$/,/^END/s/hills/\ mountains/g" file.txt A „dombokat” a „hegyekkel” helyettesíti, de csak az üres sorral kezdődő és három „END” karakterrel végződő szövegtömbökben.
sed -e "/^#/d" /etc/services/more Megjeleníti a szolgáltatásfájlt kommentált sorok nélkül
sed "$s@\([^:]*\):\([^:]*\):\([^:]*\)@\3:\2:\ [e-mail védett]"útvonal.txt Megfordítja az elemek sorrendjét a path.txt fájl utolsó sorában
sed "/regex/(x;p;x;)" fájl.txt Minden, a reguláris kifejezésnek megfelelő sor fölé új sort szúr be
sed "/AAA/!d; /BBB/!d; /CCC/!d" file.txt Az AAA, BBB és CCC betűket bármilyen sorrendben keresi
sed "/AAA.*BBB.*CCC/!d" fájl.txt Az AAA, BBB és CCC feliratokat a megadott sorrendben keresi
sed -n "/^.\(65\)/p" fájl.txt 65 vagy több karakterből álló sorokat nyomtat
sed -n "/^.\(65\)/!p" fájl.txt Legfeljebb 65 karakterből álló sorokat nyomtat
sed "/regex/G" fájl.txt Minden sor alá beszúr egy üres sort
sed "/regex/(x;p;x;G;)" fájl.txt Minden sor fölé és alá egy üres sort szúr be
sed = fájl.txt / sed "N;s/\n/\t/" Sorok számozása a file.txt fájlban
sed -e:a -e "s/^.\(1,78\)$/ &/;ta" file.txt Igazítsa jobbra a szöveget
sed -e:a -e "s/^.\(1,77\)$/ &/;ta" -e "s/\(*\)\1/\1/" file.txt Szöveg igazítása középre

6. Következtetés

Ez csak egy része annak, amit a sed-ről elmondhatunk, de ez a cikksorozat inkább egy útmutató, amely reméljük, hogy segít értékelni a Unix segédprogramok teljes erejét, és hatékonyabbá teszi a munkáját.

Legutóbb a bash szkriptekben lévő függvényekről beszéltünk, konkrétan arról, hogyan hívhatjuk meg őket 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 olyan szövegek kezelésére, amelyek naplófájloknak, konfigurációs fájloknak és egyéb fájloknak tűnnek.



Ha valamilyen módon kezeli az adatokat a bash szkriptekben, akkor ismernie kell a sed és 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 elemezzük a sed-vel való munkavégzés alapjait, és több mint három tucat példát tekintünk meg ennek az eszköznek a használatára.

sed alapjai

A sed segédprogramot stream szövegszerkesztőnek nevezik. Az interaktív szövegszerkesztők, mint például a nano, a billentyűzet segítségével dolgoznak a szövegekkel, szerkesztik a fájlokat, adnak hozzá, törölnek vagy módosítanak szövegeket. A Sed lehetővé teszi az adatfolyamok szerkesztését a fejlesztő által meghatározott szabályok alapján. Így néz ki a parancs meghívásának sémája:

$ 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/"
Íme, mi történik a parancs futtatásakor.


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

Ebben az esetben a sed a "teszt" szót a feldolgozásra átadott karakterláncban az "egy másik teszt" szavakra cseréli. Egyenes perjelek segítségével formázható az idézőjelbe tett szöveg feldolgozási szabály. Esetünkben egy s/minta1/minta2/ parancsot használtunk. Az "s" betű a "helyettesítő" szó rövidítése, vagyis van egy cserecsapatunk. A Sed ezt a parancsot végrehajtva megnézi az átvitt szöveget, és lecseréli a benne talált töredékeket (arról, hogy melyikről lesz szó, alább), a minta1-nek megfelelő minta2-re cseréli.

A fenti egy primitív példa a sed használatára, csak az induláshoz. Valójában a sed sokkal összetettebb szövegszerkesztési forgatókönyvekben használható, például fájlokkal való munkavégzés során.

Az alábbiakban egy szöveget tartalmazó fájl található, és az ezzel a paranccsal végzett feldolgozás eredménye:

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


Szövegfájl és feldolgozási eredményei

Itt a fentebb használt megközelítést alkalmazzuk, 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 a feldolgozott fájl adatait. A szerkesztő beolvassa a fájlt, feldolgozza az olvasottakat, és elküldi a kimenetet az STDOUT-nak. Annak érdekében, hogy megbizonyosodjunk arról, hogy a forrásfájl nem változott, elegendő megnyitni, miután átadtuk a sed-nek. 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á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 az -e kapcsolót a sed hívásakor. Például a következőképpen szervezheti meg két szövegrész 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 lehet szóköz 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 paranccsal lehet szöveget feldolgozni, általában a legjobb, ha először kiírja őket egy fájlba. Ha parancsokat tartalmazó fájlt szeretne mondani a sed-nek, 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
Egy ilyen parancs meghívásának eredménye hasonló az előző példákban kapott eredményhez.


Parancsokat tartalmazó fá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/" myfile
Íme, mi van a fájlban, és mit fog előállítani, amikor a sed feldolgozza.


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

A csere parancs általában egy több sorból álló fájlt dolgoz fel, de az egyes sorban csak a keresett szövegrész első előfordulásait cseréli le. A minta minden előfordulásának cseréjéhez a megfelelő jelzőt kell használni.

A helyettesítő parancs írásának szintaxisa 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 átadásakor figyelembe veszi a minta előfordulásának sorszámát a sztringben, ez az előfordulás lecserélődik.
  • 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 kell kiadni.
  • A w fájljelző utasítja a parancsot, hogy a szövegfeldolgozás eredményeit fájlba írja.
Fontolja meg a csere parancs első változatának használatát, jelezve a kívánt töredék lecserélt előfordulásának helyét:

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

A csere parancs meghívása, amely megadja a cserélni kívánt töredék pozíciójá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 a kimenetből látható, ez a parancs a minta minden előfordulását helyettesítette a szövegben.


Globális csere

A p helyettesítési parancs jelzője lehetővé teszi az illesztett sorok kimenetét, míg a sed meghí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, ha a sed ebben a konfigurációban fut, csak azok a sorok (esetünkben egy sor) jelennek meg a képernyőn, amelyekben az adott szövegrész található.


A helyettesítési 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 a w után megadott fájlba íródnak.

Határoló karakterek

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

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

Szerencsére a sed lehetővé teszi, hogy magunk állítsuk be a határoló karaktereket a helyettesítő parancsban. A határoló az s után megjelenő első karakter:

$ sed "s!/bin/bash!/bin/csh!" /etc/passwd
Ebben az esetben egy felkiáltójelet használunk határolóként, így a kód könnyebben olvasható és sokkal tisztább, mint korábban.

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

Eddig a sed-et hívtuk, hogy feldolgozzuk a szerkesztőnek átadott mindent. Egyes esetekben a szövegnek csak egy részét kell feldolgozni a sed-el - egy adott sort vagy sorcsoportot. E cél eléréséhez két megközelítés létezik:
  • Állítson be korlátot a feldolgozott sorok számára.
  • Adja meg a feldolgozni kívánt soroknak megfelelő szűrőt.
Tekintsük az első megközelítést. Itt két lehetőség van. Az első, amelyet alább tárgyalunk, egy feldolgozandó sor számának meghatározását írja elő:

$ sed "2s/test/ather test/" myfile


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/teszt/egy másik teszt/" myfile


Sortartomány kezelése

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


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

Ha csak a megadott szűrőnek megfelelő sorokat akarja feldolgozni a csere paranccsal, 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.


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 körű feltárása érdekében használhat reguláris kifejezéseket. Az egyikben beszélünk róluk a következő anyagokat ezt a sorozatot.

Sorok eltávolítása

A sed segédprogram nem csak a karaktersorozatok karaktersorozatainak másokkal való helyettesítésére alkalmas. Segítségével, nevezetesen a d paranccsal törölhet sorokat a 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. 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 sorra:

$ sed "2,3d" myfile


Sorok tartományának törlése

És itt van a sorok törlése, az adott sortól kezdve - a fájl végéig:

$ sed "3,$d" myfile


Törölje a sorokat a fájl végéig

A sorok a minta szerint is törölhetők:

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


Karakterláncok törlése minta szerint

A d hívásakor megadhat néhány 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 minták használatával

Szöveg beszúrása egy adatfolyamba

A sed használatával adatokat szúrhat be egy szövegfolyamba az i és a parancsok használatával:
  • Az i parancs újsort ad a megadott elé.
  • Az a parancs egy újsort ad a megadott után.
Vegyünk egy példát az i paranccsal:

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


Csapat i

Most nézzük meg az a parancsot:

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


Csapat 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 található hivatkozási sor, illetve a sablon számának megadása. Vegye figyelembe, hogy a karakterláncok tartományként történő címzése itt nem működik. Hívjuk meg az i parancsot, megadva azt a sorszámot, amely elé új sort szeretnénk beszúrni:

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


i parancsot a 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ő új sort szúr be a megadott elé, a második után.

Húrcsere

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 a parancs meghívásakor, akkor a mintának megfelelő összes sor lecserélődik:

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


A húrok cseréje mintával

Karakter helyettesítés

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

$ sed "y/123/567/" myfile


Karakter helyettesítés

A parancs használatakor ügyeljen arra, hogy mindenre vonatkozik szövegfolyam, nem korlátozhatja 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

stream szerkesztő sorszámokat jelenített meg a tartalmuk 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 megjelenítése

Fájlból beillesztendő adatok beolvasása

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

Vegyünk egy példát:

$ sed "3r newfile" myfile


Fájltartalom beszúrása egy adatfolyamba

Itt a newfile tartalma a myfile harmadik sora után lett beszúrva.

Íme, mi történik, ha sablont használ 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, amelyben van egy bizonyos, önmagában értelmetlen karaktersorozat, amelyet egy másik fájlból vett adatokkal kell helyettesíteni. Nevezetesen, legyen ez egy fájl newfile , amelyben a DATA karaktersorozat játssza a helyőrző szerepét. A DATA helyettesítendő adatok az adatállományban tárolódnak.

Ezt a problémát a sed folyamszerkesztő r és d parancsaival 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 a sed stream szerkesztővel való munka alapjait ismertettük. 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 szintre 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 stream szerkesztő nem interaktív szöveg szerkesztő A, amely szabványos bemenetről vagy fájlból származó adatokon hajt végre műveleteket. A Sed soronként szerkeszti az információkat.

A sed szerkesztővel való munka alapjait ismertettük. Ez az útmutató a fejlettebb technikákat ismerteti.

Csapatok összevonása

Néha szükségessé válik több parancs egyidejű átadása a sed szerkesztőnek. Ez többféleképpen történik.

Ha még nem rendelkezik tesztfájllal a sed használatához, hozza létre a következő környezetet:

CD
cp /usr/share/common-licenses/BSD .
cp /usr/share/common-licenses/GPL-3.
echo "ez az a dal, ami soha nem ér véget


nem tudni, mi volt az

csak azért, mert..." > bosszantó.txt

Mivel a sed szabványos bemenettel és kimenettel működik, természetesen csak hívható különféle csapatok egy sorban összerakva:

sed "s/and/\&/" bosszantó.txt | sed "s/emberek/lovak/"

igen, ez megy tovább, barátom
néhány ló elkezdte énekelni
nem tudni, mi volt az
és örökké énekelni fogják
csak mert...

Ez a módszer működik, de a sed több hívása többletköltséggel jár, több helyet foglal el, és nem használja a sed beépített funkcióit.

Egyszerre több parancsot is átadhat a sed-nek a -e kapcsolóval, amelyet minden parancs elé be kell szúrni:

sed -e "s/and/\&/" -e "s/people/horses/" bosszantó.txt

A parancsokat a pontosvessző karakterrel is összefűzheti egy karakterláncba. Ez a módszer pontosan ugyanúgy működik, mint az előző.

sed "s/and/\&/;s/people/horses/" bosszantó.txt

Vegye figyelembe, hogy az -e jelző használatakor törni kell egyetlen idézőjel, pontosvessző használatakor pedig az összes parancs idézőjelek között szerepelhet.

Ez a két módszer több parancs egyidejű meghívására meglehetősen kényelmes, de vannak esetek, amikor egyszerű parancssort kell használnia.

Meg kell ismerkednie az = operátorral is. Ez az utasítás sorszámot szúr be minden létező sor közé. Az eredmény így néz ki:

sed "=" bosszantó.txt
1
ez az a dal, ami soha nem ér véget
2
igen, ez folytatódik, barátom
3
néhányan elkezdték énekelni
4
nem tudni, mi volt az
5
és örökké énekelni fogják
6
csak mert...

Most próbálja meg szerkeszteni a szöveget, hogy lássa, hogyan változik a számozási formátum.

A G parancs alapértelmezés szerint egy üres sort ad a már meglévő sorok közé.

sed "G" bosszantó.txt
_
ez az a dal, ami soha nem ér véget
_
igen, ez folytatódik, barátom
_
néhányan elkezdték énekelni
_
nem tudni, mi volt az
_
és örökké énekelni fogják
_
csak mert...

Próbálja meg kombinálni ezt a két parancsot. Első pillantásra úgy tűnhet, hogy ezeknek a parancsoknak a kimenete egy üres sort tartalmaz a szövegsor és a számsor között. A kimenet azonban így néz ki:

sed "=;G" bosszantó.txt
1
ez az a dal, ami soha nem ér véget
_
2
igen, ez folytatódik, barátom
_
3
néhányan elkezdték énekelni
_
4
nem tudni, mi volt az
. . .
. . .

Ennek az az oka, hogy az = operátor megváltoztatja a kimeneti adatfolyamot (ami azt jelenti, hogy az eredményül kapott kimenet nem használható fel további szerkesztésre).

Ez megkerülhető a sed két hívásával, ahol az első hívás a második egyszerű szöveges adatfolyamaként lesz kezelve.

sed "=" bosszantó.txt | sed "G"
1
_
ez az a dal, ami soha nem ér véget
_
2
_
igen, ez folytatódik, barátom
_
3
_
néhányan elkezdték énekelni
. . .
. . .

Ne feledje, hogy néhány parancs hasonló módon működik, különösen, ha több parancsot fűz össze, és a kimenet eltér a várttól.

Speciális címzés

A címezhető sed parancsok egyik előnye, hogy reguláris kifejezéseket is használhatnak kritériumként. Ez azt jelenti, hogy olyan fájlokkal dolgozhat, amelyek tartalma nem pontosan ismert.

sed "1,3s/.*/Hello/" bosszantó.txt
Helló
Helló
Helló
nem tudni, mi volt az
és örökké énekelni fogják
csak mert...

Ehelyett használhat olyan reguláris kifejezést, amely csak az adott mintát tartalmazó sorokat találja meg. Ehhez a keresési mintát két perjel (/) közé kell tenni a parancs elé.

sed "/singing/s/it/& loudly/" bosszantó.txt
ez az a dal, ami soha nem ér véget
igen, ez folytatódik, barátom
néhányan hangosan énekelni kezdték
nem tudni, mi volt az
és örökké hangosan fogják énekelni
csak mert...

Ez a példa a szót hangosan az első elé helyezi minden sorban, amely az énekszót tartalmazza. Vegye figyelembe, hogy a második és a negyedik sor változatlan marad, mert nem egyezik a mintával.

A kifejezések megszólítása bonyolult lehet. Ez rugalmasabbá teszi a parancsokat.

A következő példa bemutatja, hogyan használhatók reguláris kifejezések címek generálására más parancsokhoz. Ez a parancs megkeresi és eltávolítja az összes üres sort:

sed "/^$/d" GPL-3
GNU ÁLTALÁNOS NYILVÁNOS LICENC
3. verzió, 2007. június 29
Copyright (C) 2007 Free Software Foundation, Inc.
Mindenki másolhat és szó szerinti másolatokat terjeszthet
pontjában található, de megváltoztatása nem megengedett.
Preambulum
A GNU General Public License egy ingyenes, copyleft licenc
. . .
. . .

Ne feledje, hogy a reguláris kifejezések a tartomány bármely részében használhatók.

Például törölheti a START és END sorok közötti sorokat:

sed "/^START$/,/^END$/d" bemeneti fájl

Ügyeljen arra, hogy ez a parancs törli az összes sort az első START szótól a talált első END szóig, és ha ismét találkozik a START szóval, akkor folytatja az adatok törlését.

A címzés megfordításához (vagyis a mintának nem megfelelő sorok kiválasztásához) használjon felkiáltójelet (!).

Például egy befejezett sor törléséhez írja be:

sed "/^$/!d" GPL-3

A címnek nem kell összetett kifejezésnek lennie ahhoz, hogy megfordítható legyen. Az inverzió ugyanúgy működik normál számozással.

Extra puffer használata

Az extra tartási puffer növeli a sed többsoros szerkesztési képességét.

Az extra puffer egy ideiglenes tárolóterület, amely bizonyos parancsokkal módosítható.

Ez az extra puffer lehetővé teszi a karakterláncok tárolását, miközben más karakterláncokon dolgozik.

Parancsok a pufferrel való munkához:

  • h: Az aktuális feldolgozási puffert (a legutóbbi egyező sort, amelyen dolgozik) egy további pufferbe másolja.
  • H: Az aktuális feldolgozási puffert hozzáfűzi az aktuális további feldolgozás végéhez, \n-nel elválasztva.
  • g: Az aktuális extra puffert az aktuális feldolgozási pufferbe másolja. Az előző feldolgozási puffer elvész.
  • G: Hozzáfűzi az aktuális mintát az aktuális feldolgozási pufferhez, \n-nel elválasztva.
  • x: Felcseréli az aktuális sablont és a további puffert.

A kiegészítő puffer tartalma mindaddig nem módosítható, amíg át nem helyezi a feldolgozási pufferbe.

Nézzünk egy összetett példát.

Próbálja meg összekapcsolni a szomszédos sorokat a következő paranccsal:

sed -n "1~2h;2~2(H;g;s/\n/ /;p)" bosszantó.txt


jegyzet: Valójában a sed külön beépített N parancsot biztosít ehhez; de a gyakorlat szempontjából hasznos megfontolni ezt a példát.

Az -n opció elnyomja az automatikus kimenetet.

1~2h - címdefiníció, amely a szöveg minden második sorát szekvenciálisan helyettesíti, az elsőtől kezdve (vagyis minden páratlan soron). A h parancs az egyező sorokat egy további pufferbe másolja.

A parancs többi része kapcsos zárójelek között van. Ez azt jelenti, hogy a parancs ezen része örökli az imént megadott címet. E zárójelek nélkül csak a H parancs örökli a címet, és a többi parancs végrehajtásra kerül soronként.

Természetesen a korábban említett N beépített sokkal rövidebb és egyszerűbb, és ugyanazt az eredményt adja:

sed -n "N;s/\n/ /p" bosszantó.txt
ez az a dal, aminek soha nincs vége, igen, ez megy tovább és tovább, barátom
néhányan úgy kezdték énekelni, hogy nem tudták, mi az
és örökké énekelni fogják, csak mert...

sed szkriptek

A parancsok szkriptekké kombinálhatók. Ez lehetővé teszi a parancsok teljes készletének végrehajtását egyetlen célsablonon.

Például írhat egy szkriptet egyszerű szöveges üzenetek létrehozásához, amelyeket előre formázni kell.

Ekkor nem kell folyamatosan ugyanazokat a parancsokat ismételnie minden üzenethez. A sed szkript lényegében egy adott objektumra alkalmazandó parancsok listája.

Például:

s/this/hat/g
s/hó/eső/g
1,5 s/fenyőtoboz/barack/g

Ezután meghívhatja a fájlt:

sed -f sedScriptName fileToEdit

Következtetés

Most már ismeri a sed-vel végzett munka fejlettebb módszereit.

Eleinte a sed parancsokat nehéz megérteni, és könnyen összekeverhetők. Ezért ajánlatos kísérletezni velük, mielőtt fontos adatokon használná őket.

Címkék: ,

Bevezetés

A sed parancs egy Stream EDitor a szövegek automatikus szerkesztéséhez. "Stream editor" - abban az értelemben, hogy folyamatosan tudja szerkeszteni a bejövő adatfolyamot, mondjuk egy programcsatorna (pipe) részeként. Automatikus – ez azt jelenti, hogy amint beállítja a szerkesztési szabályokat, a többi megtörténik az Ön unalmas részvétele nélkül. Más szóval, a sed nem interaktív.

A sed program összetettebb, mint azok a parancsok, amelyeket a HuMan sorozat korábbi cikkeiben már tárgyaltunk. Saját parancsok arzenáljával rendelkezik, így a tautológia és a félreértés elkerülése érdekében ebben a cikkben a sed parancsot ezentúl "programnak" vagy "szerkesztőnek" nevezzük, a sed szerkesztő parancsait pedig egyszerűen parancsoknak.

A sed program összetett feladatok elvégzésére képes, és időbe telik, amíg megtanulják ezeket a feladatokat megfogalmazni.

De az összetett műveletek mellett a sed parancs egyszerű, de nagyon hasznos funkciókkal rendelkezik, amelyeket semmivel sem nehezebb elsajátítani, mint a többi Unix parancsot. Ne engedje meg magának, hogy a teljes program elsajátításának bonyolultsága miatt elhagyja annak egyszerű aspektusait.

Kezdjük az egyszerűtől a bonyolultig, így mindig kitalálhatja, hol álljon meg.

Parancs s - helyettesítés (csere)

A sed programnak sok natív parancsa van. A legtöbb felhasználó csak az s parancsot ismeri, és ez elég a sed szerkesztővel való együttműködéshez. Az s parancs a PATTERN-t a REPLACE-ra cseréli:

sed s /SAMPLE/REPLACE/

$ echo nap | sed s /nap/éj/ (Enter) éjszaka

Nem lesz könnyebb. És itt van egy példa a zar.txt fájl bevitelére:

Reggelente gyakorlatokat végzett. A villám elektromos töltés. $ sed s/charge/discharge/ zar.txt Reggel lemerült. A villámlás elektromos kisülés.

Nem idéztem s/MINTA/CSERE/ mert adott példa nem igényel idézőjeleket, de ha metakarakterek szerepelnének benne, akkor idézőjelek kellenek. Annak érdekében, hogy ne törje a fejét minden alkalommal, és ne hibázzon véletlenül, mindig tegyen idézőjeleket, jobb, mint az "erősebb" egyedülállók, ez egy jó szokás. Olajjal nem rontod el a zabkását. Én sem fogok fukarkodni minden további példában az idézetekkel.

Amint látjuk, az s helyettesítő parancsnak négy összetevője van:

Maga az S parancs /.../.../ elválasztja a PATTERN mintát, hogy megkeresse, majd lecserélje a REPLACE kifejezést, amely lecseréli a PATTERN kifejezést, ha talál ilyet.

A perjelet (/) hagyományosan határolóként használják, mivel a sed ős ed használja őket (a vi-hez hasonlóan). Egyes esetekben egy ilyen elválasztó nagyon kényelmetlen, például amikor meg kell változtatni az elérési utat (útvonalat) olyan könyvtárakhoz, amelyek perjelet is tartalmaznak (/usr/local/bin). Ebben az esetben az előre dőlt perjeleket fordított perjelekkel kell elválasztani:

Sed "s/\/usr\/local\/bin/\/common\/bin/"

Ezt "palisádnak" hívják, és nagyon csúnyán néz ki, és ami a legfontosabb, érthetetlen.

A sed különlegessége, hogy lehetővé teszi bármilyen határoló használatát, például az aláhúzást:

$ echo nap | sed s_day_night_ night

vagy kettőspont:

$ echo nap | sed s:day:night: night

Ha egy tetszőleges határolót keres, a "hiányos parancs `s" üzenetet kapja, akkor ez a karakter nem alkalmas határolónak, vagy egyszerűen elfelejtett egy-két határolót beírni.

Ebben a cikkben kénytelen vagyok a hagyományos elválasztót (/) használni, hogy ne zavarjam meg az olvasót, de ha szükséges, elválasztóként a tilde-t (~) használom.

Reguláris kifejezések (RE)

(Reguláris kifejezések, reguláris kifejezés, RE)

A reguláris kifejezések témája annyira kiterjedt, hogy egész könyveket szentelnek neki (lásd a cikk végén található hivatkozásokat). Azonban a sed-ről komolyan beszélni reguláris kifejezések használata nélkül ugyanolyan terméketlen, mint a trigonometriáról beszélni számlálópálcákkal. Ezért beszélni kell legalább azokról a reguláris kifejezésekről, amelyeket gyakran használnak a sed programmal.

Val vel Vagy bármilyen más levél. A legtöbb betűt, számot és egyéb nem speciális karaktert a rendszer önmagukat reprezentáló reguláris kifejezésként kezeli.

* A karakter vagy reguláris kifejezés utáni csillag a karakter vagy reguláris kifejezés tetszőleges számú ismétlődését jelenti (beleértve a nullát is).

\+ Egy karakter vagy reguláris kifejezés egy vagy több ismétlését jelenti.

\? Azt jelenti, hogy nincs vagy egy ismétlés.

\(én\) Pontosan i ismétlést jelent.

\(i,j\) Az ismétlések száma i-től j-ig terjedő tartományban van.

\(én,\) Az ismétlések száma nagyobb vagy egyenlő, mint i.

\(,j\) Az ismétlések száma kisebb vagy egyenlő, mint j.

\(ÚJRA\) Emlékezzen a reguláris kifejezésre vagy annak egy részére a további felhasználás céljából. Például az \(a-z\)* bármilyen kisbetűs szám (beleértve a nullát is) bármilyen kombinációjával megegyezik.

. Bármely karaktert jelent, beleértve az újsor karaktert is.

^ A karakterlánc elején lévő null kifejezést jelenti. Más szóval, amit ez a karakter előz meg, annak a sor elején kell szerepelnie. Például az ^#include az #include karakterrel kezdődő sorokat keresi.

$ Ugyanaz, mint fent, csak a sor végére vonatkozik.

[LISTA] A LIST bármely karakterét jelenti. Például bármilyen angol magánhangzót keres.

[^LIST] Bármely karaktert jelent, kivéve a listán szereplőket. Például [^aeiou] bármilyen mássalhangzót keres. Megjegyzés: A LIST lehet intervallum, például [a-z], ami bármilyen kisbetűt jelent. Ha egy ]-t (szögletes zárójelet) szeretne felvenni a LIST-be, tegye a lista első helyére; ha a - (kötőjelet) szeretné szerepeltetni a LISTÁBAN, akkor először vagy utolsóként adja meg a listában.

RE1\|RE2 Azt jelenti, hogy PB1 vagy PB2.

RE1RE2 A PB1 és PB2 reguláris kifejezések egyesülését jelenti.

\nÚjsor karaktert jelöl.

\$; \*; \.; \[; \\; \^ Ezek rendre azt jelentik: $; *; .; [; \; ^

Figyelem: Pihenés egyezmények a C nyelvben elfogadott fordított perjel (\) alapján nem támogatja a sed program.

\1 \2 \3 \4 \5 \6 \7 \8 \9 A reguláris kifejezés egyező részét jelenti, a \(és \) használatával tárolva.

Néhány példa:

abcdef Azt jelenti, hogy abcdef

a*b Nullát vagy tetszőleges számú a és egy b betűt jelent. Például aaaaaab; ab; vagy b.

a\?b Jelentése b vagy ab

a\+b\+ jelentése egy vagy több levelet a és egy vagy több b. Például: ab; aaaab; abbbbbb; vagy aaaaabbbbbb.

.* A sorban lévő összes karaktert jelenti, minden sorban, beleértve az üreseket is.

.\+ Egy karakterlánc összes karakterét jelenti, de csak a legalább egy karaktert tartalmazó karakterláncokon. Az üres sorok nem egyeznek a megadott reguláris kifejezéssel.

^fő.*(.*) Megkeresi a main szóval kezdődő sorokat, valamint azokat, amelyek nyitó és záró zárójelet tartalmaznak, és tetszőleges számú karakter lehet a nyitó zárójel előtt és után.

^# Megkeresi a # jellel kezdődő sorokat (például megjegyzéseket).

\\$ A fordított perjelre (\) végződő sorokat keresi.

Bármilyen betű vagy szám

[^ ]\+ (A szögletes zárójel a ^ karakteren kívül szóközt és tabulátort is tartalmaz) -- Egy vagy tetszőleges számú karaktert jelent, kivéve a szóközt és a tabulátort. Általában szót jelent.

^.*A.*$ Eszközök nagybetű Pont a sor közepén.

A.\(9\)$ Egy nagy A betűt jelöl, pontosan a tizedik része a sor végétől.

^.\(,15\)A Nagy A betűt jelent, pontosan a tizenhatodik a sor elejétől.

Most, hogy láttunk néhány reguláris kifejezést, térjünk vissza a sed parancsához.

A & használatával, amikor a PATTERN ismeretlen „Hogyan van ez ismeretlen?”, akkor megkérdezi: „Nem tudja, mit szeretne lecserélni?” Válasz: A szövegben található számokat zárójelbe szeretném tenni. Hogyan kell csinálni? Válasz: használja a & szimbólumot.

Az & (és) karakter, ha a REPLACEMENT-ben van elhelyezve, a szövegben található bármely MINTÁT jelent. Például:

$ echo 1234 | sed "s/*/(&)/" (1234)

Az intervallum után egy csillag (csillag) szükséges a mintában található összes számjegy helyettesítéséhez. Anélkül ez lenne:

$ echo 1234 | sed "s//(&)/" (1)234

Vagyis az első talált számjegyet vettük mintának.

Íme egy példa egy teljesen értelmes betöltésre: hozzunk létre egy formula.txt fájlt:

A+432-10=n

és alkalmazd rá a parancsot:

$ sed "s/*-*/(&)/" formula.txt a+(432-10)=n

A matematikai képlet egyértelmű jelentést kapott.

Egy másik "és" karakter is használható a MINTÁZAT megduplázására:

$ echo 123 | sed "s/*/& &/" 123 123

Van itt egy finomság. Ha egy kicsit bonyolítjuk a példát:

$ echo "123 abc" | sed "s/*/& &/" 123 123 abc

ahogy az várható volt, csak a számok duplázódnak, mivel a PATTERN-ben nincsenek betűk. De ha felcseréljük a szövegrészeket:

$ echo "abc 123" | sed "s/*/& &/" abc 123

akkor a számok megkettőzése nem fog működni. Ez a * reguláris kifejezés jellemzője – csak a karakterlánc első karakterével egyezik. Ha meg akarjuk duplázni a számjegyeket, bárhol is legyenek, módosítanunk kell a REPLACE reguláris kifejezést:

$ echo "abc defg 123" | sed "s/*/& &/" abc defg 123 123

akkor a számjegyek megduplázódnak, függetlenül a megelőző "szavak" számától.

A \(, \) és \1 escape karakterek használata a PATTERN rész kezelésére A \( és \) escape karakterek (megtisztított zárójelek) a reguláris kifejezés részeinek emlékezésére szolgálnak.

A \1 szimbólum az első megjegyzett részt jelenti, a \2 a második, és így tovább, legfeljebb kilenc megjegyzett részt ( több program nem támogatja). Vegyünk egy példát:

$ echo abcd123 | sed "s/\(*\).*/\1/" abcd

Itt a \(*\) azt jelenti, hogy a programnak bármilyen mennyiségben meg kell emlékeznie az összes alfabetikus karakterre; .* jelentése tetszőleges számú karakter az első megjegyzett rész után; és a \1 azt jelenti, hogy csak az első memorizált részt akarjuk látni. Így is van: a program kimenetében csak betűket látunk, számokat nem.

A szavak felcseréléséhez meg kell jegyeznie két alMINTÁT, majd fel kell cserélnie őket:

$ echo hülye pingvin |sed "s/\([a-z]*\) \([a-z]*\)/\2 \1/" hülye pingvin

Itt a \2 a második almintát, a \1 pedig az elsőt jelenti. Figyelje meg az első \([a-z]*\) és a második \([a-z]*\) kifejezés közötti távolságot. Két szót kell találni.

A \1 jelnek nem kell csak a REPLACEMENT-ben lennie, hanem jelen lehet a PATTERN-ben is, például ha a duplikált szavakat szeretnénk eltávolítani:

$ echo pingvin pingvin | sed "s/\([a-z]*\) \1/\1/" pingvin

Parancshelyettesítő módosítók s

A cseremódosítók az utolsó határoló után kerülnek elhelyezésre. Ezek a módosítók határozzák meg, hogy a program mit fog tenni, ha egy karakterláncban egynél több PATTERN egyezés található, és hogyan cserélje le.

/g módosító

Globális csere

A sed program, mint a legtöbb Unix segédprogram, egy sort olvas be, amikor fájlokkal dolgozik. Ha egy szó cseréjét rendeljük el, akkor a program csak az első egyező szót cseréli le az adott sorban. Ha meg akarunk változtatni minden szót, ami megfelel a mintának, akkor a /g módosítót kell beírni.

/g módosító nélkül:

$ echo ez a macska volt a leggyakoribb macska | sed "s / macska / cica /" ez a cica volt a legközönségesebb macska

A szerkesztő csak az első egyező szót cserélte ki.

És most a globális helyettesítő módosítóval:

$ echo ez a macska volt a leggyakoribb macska | sed "s/cat/kitten/g" ez a cica volt a leggyakoribb cica

A megadott karakterláncban szereplő összes találat le lett cserélve.

És ha meg kell változtatni az összes szót, mondjuk, tegye zárójelbe? Ezután ismét a reguláris kifejezések jönnek a segítségre. Az összes alfabetikus karakter kiválasztásához használhatja az [A-Zaa-z] konstrukciót, de az olyan szavak, mint a „valami” vagy a „valamivel” nem fognak beletartozni. Sokkal kényelmesebb a szerkezet [ ^ ]*, amely a szóköz kivételével minden karakterrel megegyezik, tehát:

$ visszhang hülye pingvin félénken elbújik | sed "s/[^ ]*/(&)/g" (buta) (pingvin) (félénken) (bújik)

Hogyan válasszuk ki a kívánt egyezést több közül

Ha nem alkalmazunk módosítókat, a sed csak a PATTERN-nek megfelelő első szót cseréli le. Ha alkalmazza a /g módosítót, a program minden egyező szót lecserél. És hogyan lehet kiválasztani egy egyezést, ha több is van egy vonalon? - A számunkra már ismert \ (és \) szimbólumok segítségével emlékezzen az alMINTÁKRA, és válassza ki a kívántat a \ 1 - \ 9 szimbólumok segítségével.

$ visszhang hülye pingvin | sed "s/\([a-z]*\) \([a-z]*\)/\2 /" pingvin

Ebben a példában mindkét szót megjegyeztük, és a másodikat (pingvin) az első helyre helyezve töröltük az elsőt (hülye) úgy, hogy szóközt tettünk a CSERE részben. Ha szóköz helyett tetszőleges szót teszünk, akkor ez lecseréli az elsőt (hülye):

$ visszhang hülye pingvin | sed "s/\([a-z]*\) \([a-z]*\)/\2 smart /" penguin smart

Numerikus módosító

Ez egy egy/két/háromjegyű szám, amely az utolsó határoló után jön, és jelzi, hogy melyik egyezést kell cserélni.

$ echo nagyon hülye pingvin | sed "s/[a-z]*/good/2" nagyon jó pingvin

Ebben a példában minden szó egyezést jelent, és a CSERE rész után 2-es módosítóval közöltük a szerkesztővel, hogy melyik szót szeretnénk lecserélni.

A digitális módosítót kombinálhatja a /g módosítóval. Ha az első szót változatlanul kell hagynia, és a második és az azt követő szavakat a "(törölt)" szóra kell cserélnie, akkor a parancs a következő lesz:

$ echo nagyon hülye pingvin | sed "s/[a-z]*/(törölt)/2g" nagyon (törölt) (törölt)

Ha valóban el szeretné távolítani az összes következő egyezést, kivéve az elsőt, akkor tegyen szóközt a CSERE részben:

$ echo nagyon hülye pingvin | sed "s/[a-z]*/ /2g" nagyon

Vagy ne csinálj semmit:

$ echo nagyon hülye pingvin | sed "s/[^ ]*//2g" nagyon

A numerikus módosító tetszőleges egész szám lehet 1-től 512-ig. Például, ha az egyes sorok 80. karaktere után kettőspontot kell tenni, akkor a parancs segít:

$ sed "s/./&:/80" fájlnévvel

Módosító /p - kimenet szabványos kimenetre (nyomtatás - nyomtatás)

A sed program alapértelmezés szerint az eredményt a szabványos kimenetre (például a monitor képernyőjére) adja ki. Ez a módosító csak a sed -n kapcsolóval használható, amely csak blokkolja az eredmény kimenetét a képernyőn.

/w módosító

Lehetővé teszi a szövegfeldolgozás eredményeinek a megadott fájlba írását:

$ sed "s /PATTERN/REPLACE /w fájlnév

/e módosító (GNU kiterjesztés)

Lehetővé teszi egy shell parancs (nem a sed program) megadását REPLACEMENT-ként. Ha a PATTERN egyezést talál, akkor azt a CSERE szakaszban megadott parancs kimenete váltja fel. Példa:

$ visszhang éjszaka | sed "s/night/echo day/e" day

/I és /i módosítók (GNU kiterjesztés)

Tegye a csere folyamatát a kis- és nagybetűk megkülönböztetésére.

$echo Night | sed "s/éj/nap/i" nap

Módosító kombinációk

A módosítók kombinálhatók, ha van értelme. Ebben az esetben a w módosítót utoljára kell elhelyezni.

Konvenciók (GNU kiterjesztés) Csak öt van belőlük:

\L a REPLACEMENT karaktereket kisbetűssé alakítja \l a következő REPLACE karaktert kisbetűvé alakítja \U a REPLACEMENT karaktereket nagybetűssé alakítja \u a következő REPLACE karaktert nagybetűssé alakítja \E megszakítja a \L vagy \U által indított fordítást. Nyilvánvaló okokból ezek a konvenciók önmagukban használatosak. Például:

$ visszhang hülye pingvin | sed "s/stupid/\u&/" Hülye pingvin

$ visszhang kiskutya | sed "s/[a-z]*/\u&/2" kiskutya

A sed parancsának szinte minden vonatkozásával foglalkoztunk. Most itt a sor, hogy mérlegeljük a program lehetőségeit.

sed programlehetőségek

A program meglepően kevés lehetőséget tartalmaz. (Ami némileg kompenzálja a parancsok, módosítók és egyéb funkciók túlsúlyát). A jól ismert --help (-h) és --version (-V) opciókon kívül, amelyeket nem fogunk figyelembe venni, csak három van belőlük:

Opció -e--expression=parancskészlet

Több parancs futtatásának egyik módja az -e kapcsoló használata. Például:

Sed -e "s/a/A/" -e "s/b/B/" fájlnév

A cikkben szereplő összes korábbi példa nem igényelte az -e kapcsolót csak azért, mert egyetlen parancsot tartalmazott. A példákba beletehetnénk az -e opciót, az nem változtatna semmit.

Opció -f Ha sok parancsot kell végrehajtania, kényelmesebb, ha fájlba írja őket, és használja az -f kapcsolót:

sed -f sedscript fájlnév

A Sedscript itt a parancsokat tartalmazó fájl neve. Ezt a fájlt sed program szkriptnek (a továbbiakban egyszerűen script) nevezik. Minden script parancsnak külön sort kell foglalnia. Például:

# megjegyzés – Ez a szkript minden kisbetűs magánhangzót nagybetűre cserél s/a/A/g s/e/E/g s/i/I/g s/o/O/g s/u/U/g

A szkriptet tetszés szerint nevezheti el, fontos, hogy ne keverje össze a szkriptfájlt a feldolgozás alatt álló fájllal.

Opció -n A sed -n program nem ad ki semmit a szabványos kimenetre. A kimenet megszerzéséhez speciális utasításra van szüksége. Láttuk már a /p módosítót, amivel ilyen jelzést lehet adni. Emlékezzünk a zar.txt fájlra:

$ sed "s/1-9/&/p" zar.txt Reggel elvégezte a gyakorlatait. A villám elektromos töltés.

Mivel nem találtunk egyezést a PATTERN-nel (nincs szám a fájlban), az s parancs a /p módosítóval és a & jellel CSERE (ne feledje, hogy az és jel magát a MINTÁT jelenti) úgy működik, mint a cat parancs.

Ha a fájlban PATTERN található, akkor a PATTERN-t tartalmazó sorok megduplázódnak:

$ sed "s/exercises/&/p" zar.txt Reggelente gyakorlatokat végzett. Reggelente gyakorlatokat végzett. A villám elektromos töltés.

Most adjuk hozzá az -n opciót:

$ sed -n "s/charge/&/p" zar.txt Reggel elvégezte a gyakorlatait.

A programunk most úgy működik, mint egy grep parancs – csak a PATTERN-t tartalmazó sorokat adja vissza.

A szerkeszthető szöveg kívánt elemeinek kiválasztása

Egyetlen paranccsal, s, láthattuk a sed szerkesztő elképesztő erejét. De ez nem más, mint a keresés és a csere. Sőt, a munka során a sed egyesével szerkeszti az egyes sorokat, nem figyelve másokra. Kényelmes lenne korlátozni a módosítandó sorok tartományát, például:

  • Sorok kiválasztása szám szerint
  • Válasszon ki sorokat egy számtartományban
  • Csak azokat a sorokat jelölje ki, amelyek valamilyen kifejezést tartalmaznak
  • Csak sorokat jelöljön ki néhány kifejezés között
  • Csak a fájl elejétől néhány kifejezésig jelöljön ki sorokat
  • Csak egy kifejezéstől a fájl végéig tartó sorokat jelölje ki

A sed program mindezt és még sok mást is megtesz. Bármely sed szerkesztő parancs alkalmazható címenként, egy címtartományra, vagy a fenti sortartomány-korlátozásokkal. A címnek vagy megszorításnak közvetlenül a parancs előtt kell lennie:

Sed "cím/korlát parancs"

Válassza ki a sorokat számok alapján

Ez a legegyszerűbb eset. Csak adja meg a kívánt sor számát a parancs előtt:

$ sed "4 s/[a-z]*//i" gumilev.txt Milyen különös boldogság A hajnali szürkületben, Tavaszi hó olvadásában, mindennek, ami elvész és bölcs.

$ sed "3 s/B/(B)/" gumilev.txt Milyen különös boldogság A hajnali kora alkonyatban, (Ben) tavaszi hó olvadásában, Mindenben, ami elvész és bölcs.

Sorok kiválasztása számtartományban

A tartományt nem meglepő módon vesszővel választjuk el:

$ sed "2.3 s/B/(B)/" gumilev.txt Micsoda különös boldogság (Ben) a hajnali szürkület, (Ben) tavaszi hó olvadása, Mindenben, ami elvész és bölcs.

Ha egy tartományt kell megadnia a fájl utolsó soráig, és nem tudja, hány sort tartalmaz, akkor használja a $ jelet:

$ sed "2,$ s/in/(in)/i" gumilev.txt Milyen különös boldogság (benne) a hajnali szürkületben, (ben) a tavaszi hó olvadása, (benne) minden, ami elpusztul és van bölcs.

Kifejezést tartalmazó sorok kiválasztása

A keresési kifejezés perjelekbe (/) kerül, és a parancs elé kerül:

$ sed "/morning/ s/in/(in)/i" gumilev.txt Milyen különös boldogság (benne) a hajnali szürkületben, Tavaszi hó olvadásában, Mindenben, ami elvész és bölcs.

Sorok kijelölése két kifejezés közötti tartományban

A sorszámokhoz hasonlóan a tartományt vesszővel elválasztva adjuk meg:

$ sed "/reggel/,/wise/ s/in/(in)/i" gumilev.txt Milyen különös boldogság (ben) a hajnali kora szürkületben, (ben) a tavaszi hó olvadása, (ben) minden ami elvész és bölcs .

Sorok kijelölése egy fájl elejétől valamilyen kifejezésig

$ sed "1,/snow/ s/in/(in)/i" gumilev.txt Milyen különös boldogság (benne) a hajnali kora alkonyatban, (ben) a tavaszi hó olvadásában, Mindenben, ami elvész és van bölcs.

Sorok kijelölése valamelyik kifejezéstől a fájl végéig

$ sed "/snow/,$ s/in/(in)/i" gumilev.txt Milyen különös boldogság A hajnali kora szürkületben, (ben) a tavaszi hó olvadása, (benne) minden, ami elpusztul és van bölcs.

Egyéb sed parancsok

d parancs (törlés)

Eltávolítja a megadott sorokat a szabványos kimenetből:

$ sed "2 d" gumilev.txt Milyen különös boldogság Tavaszi hó olvadásában, Mindenben, ami elvész és bölcs.

És gyakrabban írnak könnyebben (szóköz nélkül):

Sed "2d" gumilev.txt

Minden, amit az előző részben a sorcímzésről elmondtunk, a d parancsra vonatkozik (ahogy szinte minden sed szerkesztő parancsra).

A d paranccsal célszerű kidobni néhány levél felesleges "fejlécét":

$ sed "1,/^$/ d" fájlnév

(Sorok törlése az elsőtől az első üres sorig).

Szabadulj meg a megjegyzésektől konfigurációs fájl:

$ sed "/^#/d" /boot/grub/menu.lst

És soha nem tudhatod, hol kell eltávolítani a felesleges vonalakat!

p parancs (nyomtatás)

Az angol "print" szót "nyomtatásnak" fordítják, amely oroszul nyomtatóhoz vagy legalábbis billentyűzethez kapcsolódik. Valójában az angol szövegkörnyezetben ez a szó gyakran azt jelenti, hogy egyszerűen a monitor képernyőjén jelenik meg. Tehát a p parancs nem ír ki semmit, csak a megadott sorokat írja ki a képernyőre.

Önmagában használva a p parancs megduplázza a sorokat a kimenetben (mivel a sed program alapértelmezés szerint egy sort nyomtat a képernyőre, a p parancs pedig másodszor is kiírja ugyanazt a sort).

$ echo van egy macskám | sed "p" van egy macskám van egy macskám

Ez a tulajdonság például az üres sorok megkettőzésére használható a szöveg megjelenésének javítása érdekében:

$ sed "/^$/ p fájlnév

De a p parancs felfedi valódi arcát az -n kapcsolóval kombinálva, amely, mint emlékszel, megtiltja a sorok képernyőre való kiírását. Az -n kapcsolót a p paranccsal kombinálva csak a szükséges sorokat kaphatja meg a kimenetben.

Például nézze meg az egytől tízig terjedő sort:

$ sed -n "1,10 p" fájlnév

Vagy csak kommentek:

$ sed -n "/^#/ p" /boot/grub/menu.lst # GRUB konfigurációs fájl "/boot/grub/menu.lst". # generálta a "grubconfig". V. 2008. március 23. 21:45:41 # # GRUB globális szekció indítása # GRUB globális szakasz vége # Linux rendszerindító partíció konfigurációja kezdődik # Linux rendszerindító partíció konfigurációja véget ér # Linux rendszerindító partíció konfigurációja kezdődik # Linux rendszerindító partíció konfigurációja véget ér

Ami nagyon hasonlít a grep-re, amellyel már akkor találkoztunk, amikor az -n opcióról beszéltünk a /p módosítóval. De a grep paranccsal ellentétben a sed szerkesztő lehetővé teszi, hogy ne csak megtalálja ezeket a sorokat, hanem módosítsa is őket, például minden Linuxot lecserélve Unixra:

$ sed -n "/^#/p" /boot/grub/menu.lst | sed "s/Linux/Unix/" # GRUB konfigurációs fájl "/boot/grub/menu.lst". # generálta a "grubconfig". V. 2008. március 23. 21:45:41 # # GRUB globális szakasz indítása # GRUB globális szakasz vége # Unix rendszerindító partíció konfigurációja kezdődik # Unix rendszerindító partíció konfigurációja véget ér # Unix rendszerindító partíció konfigurációja kezdődik # Unix rendszerindító partíció konfigurációja véget ér

Csapat!

Néha az összes sort szerkesztenie kell, kivéve azokat, amelyek megfelelnek a PATTERN-nek vagy egy kijelölésnek. Szimbólum felkiáltójel(!) megfordítja a kijelölést. Például töröljük ki az összes sort, kivéve a másodikat Gumiljov négysorából:

$ sed "2 !d" gumilev.txt A hajnali szürkületben,

Vagy jelölje ki az összes sort, kivéve a megjegyzéseket a /boot/grub/menu.lst fájlból:

$ sed -n "/^#/ !p" /boot/grub/menu.lst alapértelmezett 1 időtúllépés 20 gfxmenu (hd0,3)/boot/message title SuSe on (/dev/hda3) root (hd0,2) kernel /boot/vmlinuz root=/dev/hda3 ro vga=773 acpi=off title Linux on (/dev/hda4) root (hd0,3) kernel /boot/vmlinuz root=/dev/hda4 ro vga=0x317

q parancs (kilépés)

A q parancs leállítja a sed programot a megadott sor után. Ez akkor hasznos, ha le szeretné állítani a szerkesztést, miután elért egy bizonyos pontot a szövegben:

$ sed "11 q" fájlnév

Ez a parancs a 11. sor elérésekor fejezi be a munkát.

A q parancs azon kevés sed parancsok egyike, amelyek nem fogadnak el sortartományokat. A csapat nem hagyhatja abba a munkát 10-szer egymás után, ha beírjuk:

Sed "1.10 q" Abszurd!

w (írási) parancs

Az s parancs w módosítójához hasonlóan ez a parancs lehetővé teszi a program kimenetének fájlba írását:

$ sed -n "3,$w gum.txt" gumilev.txt

A gumilev.txt fájlból megkapjuk a Gumilev-négysor utolsó két sorát tartalmazó gum.txt fájlt. Sőt, ha már létezik ilyen fájl, akkor felülírja. Ha nem adjuk meg az -n opciót, akkor a program a gum.txt fájl létrehozása mellett a gumilev.txt fájl teljes tartalmát is megjeleníti a képernyőn.

Bedolgozni parancs sor, kényelmesebb a normál kimeneti átirányítást (> vagy >>) használni, de a sed szkriptekben a w parancs valószínűleg megtalálja a használatát.

r parancs (olvasás)

Ez a parancs nem csak a megadott fájlt olvassa be, hanem annak tartalmát is beszúrja a kívánt helyre a szerkesztett fájlban. A "szükséges hely" kijelölése már ismerős számunkra (sorszámok, kifejezések stb. alapján). Példa:

$ visszhang Gumilev verséből: | sed "rgumilev.txt"

Gumiljov verséből:

Milyen különös boldogság A hajnali szürkületben, A tavaszi hó olvadásában, Mindenben, ami elvész és bölcs.

Parancs =

Megadja a megadott sor számát:

$ sed "/snow/=" gumilev.txt Milyen különös boldogság A hajnali szürkületben, 3 A tavaszi hó olvadásában, Mindenben, ami elvész és bölcs.

$ sed -n "/snow/=" gumilev.txt 3

A parancs csak egy címet fogad el, intervallumokat nem.

Csapat y

Ez a parancs lecseréli a PATTERN szakasz karaktereit a REPLACE részben lévő karakterekre, programként működik tr.

$ echo Autó - a múlt öröksége | sed "y/Auto/Paro/" Paromobile – a múlt öröksége

Csapat y csak akkor működik, ha a PATTERN karakterek száma megegyezik a REPLACE karakterek számával.

sed program szkriptjeit

A sed teljes szövegszerkesztőként való használatához meg kell tanulnia sed szkriptek írását. A sed programnak saját egyszerű programozási nyelve van, amely lehetővé teszi olyan szkriptek írását, amelyek csodákra képesek.

Ez a cikk nem tartalmazhatja a sed szkriptek leírását, és a szerzője sem a sed programozási nyelv elsajátítását tűzte ki maga elé. Ebben a cikkben a sed szerkesztő parancssori használatára összpontosítottam, különös tekintettel a csövek szűrőjeként való használatára. Emiatt számos sed parancsot kihagytam, amelyeket csak a szkriptjei használnak.

Sok rajongója van a sed szerkesztőnek, és sok cikk található a szkriptek témájában, beleértve a Runetet is. Így azoknak, akiket érdekel ez a csodálatos program, nem lesz nehéz tudásukat feltölteni.

A sed program és a cirill karakterek

Amint a cikkben szereplő példákból látható, a sed program egy megfelelően oroszosított rendszeren folyékonyan beszéli a "nagy és hatalmas" nyelvet.

A sed program összefoglalója

A sed program egy többfunkciós adatfolyam-szerkesztő, amely nélkülözhetetlen:

  • Nagy szövegtömbök szerkesztése
  • Bármilyen méretű fájlok szerkesztése, ha a szerkesztési lépések sorrendje túl bonyolult
  • Adatok szerkesztése, amint azok elérhetővé válnak, beleértve a valós idejű adatokat is - vagyis olyan esetekben, amikor az interaktív szövegszerkesztők használata nehéz vagy lehetetlen.

Hetekig vagy akár hónapokig tart a sed program teljes elsajátítása, mivel ehhez:

  • Tanulj meg reguláris kifejezéseket
  • Tanulja meg, hogyan kell sed szkripteket írni, ha megtanulja az ezekben a szkriptekben használt egyszerű programozási nyelvet

Másrészt a leggyakoribb sed parancsok közül néhány olyan könnyen elsajátítható, mint bármely Unix parancs; Remélem, ez a cikk segít ebben.

Utószó

Eddig a HuMan sorozat cikkeiben igyekeztem legalább röviden felfedni a leírt parancs minden opcióját, minden paraméterét, hogy a cikk lecserélhesse a manát. A jövőben is ragaszkodom ehhez az elvhez.

Ez a cikk kivétel, mivel nem írja le a program összes funkcióját. Teljes leírásukhoz nem cikkre, hanem könyvre lenne szükség. A cikk azonban lehetővé teszi, hogy képet kapjon a sed szerkesztőről, és elkezdje használni ezt a csodálatos programot a leggyakoribb parancsok segítségével.

Ha hibát észlel, jelöljön ki egy szövegrészt, és nyomja meg a Ctrl + Enter billentyűket
OSSZA MEG: