Linux-parancsok megtanulása: sed. A Linux sed Streaming Text Editor sed Regular Expressions használatával

  • Dátum: 14.05.2021

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

Ebben a cikkben néhány egyszerű példát mutatok be a használatára sedés beszéljünk főbb jellemzőiről.

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

sed parancsformátum

A sed parancs formátuma:

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

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

Parancsformátum szerkesztése

A szkriptfájl egy sor parancsból áll:

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

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

$ - utolsó sor
start~N- Minden egyes N-adik sor, számmal kezdődően Rajt
/reguláris kifejezés/- a reguláris_kifejezésnek megfelelő karakterláncok
Példák:

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

Alapvető parancsok

Fontolja meg az alapvető parancsokat:

[cím] egy szöveg- adjon hozzá egy új sort a szöveg után meghatározott sor

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

[cím [, cím]] c szöveg- Törli a kijelölt sorokat és lecseréli a következőre szöveg

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

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

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

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

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

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

$ sed -ne "2p" sed_test sed_test_2 22222

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

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

[cím [, cím]] s/regex/replacement/flags- Cseréli reguláris kifejezés a csere-y zászlókkal:

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

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

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

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

Címkék

: címke- leképezés egy parancscsoportra címke
b címke címke, ha címke hiányzik, majd lépjen a kötegfájl végére.

t jel- ugorjon a címke által jelzett parancsra címke csak a paranccsal végrehajtott sikeres csere után s///

Futási hurok

A sed két adatpufferrel működik: fő és kiegészítő pufferrel. Mindkét puffer kezdetben üres.
Ezekkel a pufferekkel a következő parancsok használatával lehet dolgozni: \\`h', 'H', 'x', 'g', 'G' 'D' h- Cserélje ki a segédpuffer tartalmát a fő puffer tartalmára
H- Adjon hozzá egy új sort a kiegészítő pufferhez, majd fűzze hozzá a fő puffer tartalmát a kiegészítő puffer tartalmához
x- Cserélje fel mindkét puffer tartalmát
g- Cserélje ki a fő puffer tartalmát a segéd puffer tartalmára
G- Adjon hozzá egy új sort a fő pufferhez, majd fűzze hozzá a kiegészítő puffer tartalmát a fő puffer tartalmához
D- Törölje a fő pufferszöveget a következő újsor karakterig
N- Adjon hozzá egy új sort a fő pufferhez, majd adja hozzá a következő feldolgozandó sort
P- Kiírja a fő puffer tartalmát a következő újsor karakterig.

Bonyolultabb példák

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

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

Olvassa el a fájl sorait (az utolsó sor számát jelenítse meg)

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

eredmény

$ sed -nf count.sed sed_test 3

Húr megfordítása

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

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

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

további információ

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

A dokumentum készült: 2010.02.16

Egy másik példa

Az i-hez *.txt-ben; do sed -i "/^\^/ s/^\^\([^\^]*\)\^\^/====\1====/;/^=/ s/$/ \n^ Parancs ^ Leírás ^/" $i; Kész

Ez a sor végigfut az aktuális könyvtárban található összes olyan fájlon, amelynek neve .txt-re végződik, és:

    /^\^/ s/^\^\([^\^]*\)\^\^/====\1====/ – ha a karakterlánc "^"-vel kezdődik, cserélje ki a "^ Szöveg ^ ^". ide: " ==== Szöveg ==== ";

    /^=/ s/$/ \n^ Parancs ^ Leírás ^/ - ha a sor " = "-vel kezdődik (és kezdődik, mert az előző bekezdésben mi magunk csináltuk, és itt csak az a feltétel, hogy más sorokat érintsünk ), cserélje ki ezt a sort ugyanarra a sorra, plusz egy kocsivisszajelzés, plusz " ^ Parancs ^ Leírás ^ ". Más szóval, illesszen be egy ilyen sor után egy sort, amely tartalmazza a "^ Parancs ^ Leírás ^ " elemet.

Mire jó ez? Ez az. A hosszú dokuwiki fájlt linux parancsokkal kis fájlokra bontottam. Így néztek ki:

^ Elemzés fájlrendszerek^^ | badblocks -v /dev/hda1 | ellenőrizze a hda1 partíciót hibás blokkokat keresve | ...

Ez a parancssorozat mindegyiket a következő formává alakította:

Fájlrendszerek elemzése ==== ^ Parancs ^ Leírás ^ | badblocks -v /dev/hda1 | ellenőrizze a hda1 partíciót hibás blokkokat keresve | ...

Sor törlése kontextus szerint

Egy adott kontextust tartalmazó sor eltávolításához a következő konstrukciót használhatja:

sed -i "/^AUTO_SAVE/ d" notes.ini

Ez a parancs a notes.ini fájlban eltávolítja az AUTO_SAVE karakterrel kezdődő összes sort.

Töröljön egy sort vagy több sort egy fájlból

Egy sor vagy több sor törléséhez egy fájlban a következő konstrukciót használom:

Sed -i "2,1d"

Ez a parancs a fájlban található törli a második sort.

Sed -i "5,10d"

Ez a parancs a fájlban található tíz sort töröl az ötödiktől kezdve (beleértve az ötödiket is).

Karakterlánc összefűzése

Két szomszédos sor párosítása

Két sor összefűzése páronként, egymástól kocsivisszajelzéssel:

cat /etc/hosts | sed "N;s/\n/ - /"

PS. Határolójel: " - ".

Váltás nagy- vagy kisbetűre

Nagybetűs:

Echo Sed | sed "s/.*/\U&/"

Kisbetűvel:

Echo Sed | sed "s/.*/\L&/" sed

"Vágjon" egy darabot a patakból

Vegyük például a dig eredményét:

$ dig ya.ru

Adj nekünk

; <<>> DiG 9.7.0-P1<<>> ya.ru ;; globális beállítások: +cmd ;; választ kaptam: ;; ->>Fejléc<<- opcode: QUERY, status: NOERROR, id: 5252 ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;ya.ru. IN A ;; ANSWER SECTION: ya.ru. 4194 IN A 87.250.251.3 ya.ru. 4194 IN A 93.158.134.3 ya.ru. 4194 IN A 213.180.204.3 ya.ru. 4194 IN A 77.88.21.3 ya.ru. 4194 IN A 87.250.250.3 ;; Query time: 0 msec ;; SERVER: 192.168.2.9#53(192.168.2.9) ;; WHEN: Wed Nov 10 14:33:37 2010 ;; MSG SIZE rcvd: 103

és ezzel:

Dig ya.ru | sed "0,/VÁLASZ SZEKCIÓ:/d; /^$/q"

Ya.ru. 4160 IN A 93.158.134.3 ya.ru. 4160 IN A 213.180.204.3 ya.ru. 4160 IN A 77.88.21.3 ya.ru. 4160 IN A 87.250.250.3 ya.ru. 4160 IN A 87.250.251.3

    0,/ANSWER SECTION:/d - törli az adatfolyam összes sorát az elsőtől a következőt tartalmazó sorig, beleértve a következőt is:

    /^$/q - amint üres sort talál, állítsa le a további feldolgozást.

Példák 1

Kiképzés:

Cat /etc/passwd > ./test

SEDLeírás
kat ./teszt | sed -e "s/systemd/SysV/g; s/Management/Unmanaged/"Minden soron alkalmazzon két cserét
kat ./teszt | sed -n "s/systemd/SysV/p"Csak a lecserélt karakterláncokat adja ki. -n Elnyomja a normál kimenetet.
kat ./teszt | sed "s/systemd/SysV/w ./out"Kimenet cseréje reszelőre
kat ./teszt | sed "41s/systemd/SysV/"Cserélje ki a 41. sorban
kat ./teszt | sed "41,44s/systemd/SysV/"Cserélje ki a 41–44. sorokat.
kat ./teszt | sed "41,$s/systemd/SysV/"Cserélje le a sorokat a 41-től az utolsóig.
kat ./teszt | sed "/games/,/syslog/s!/usr/sbin/nologin!/bin/bash!"Cserélje ki a játékokat és a rendszernaplót tartalmazó sorok közötti sorokat
kat ./teszt | "1c\TÖRÖLT"Cserélje ki teljesen az első sort
kat ./teszt | sed "1,5c\DELETED"Cserélje ki az 1-től 5-ig terjedő szövegsorokra
kat ./teszt | sed "y!:/!;\\!"Cserélje ki a ":"-t ";"-re, a "/"-t pedig "\"-re
kat ./teszt | sed "="Nyomtassa ki a sorszámokat is
kat ./teszt | sed -n "/systemd/="Nyomtassa ki a sorszámokat, ahol az alkarakterlánc előfordul
Illessze be a fájl tartalmát (ki) az adatfolyamba:
kat ./teszt | sed "1 router"1 sor után
kat ./teszt | sed "$r out"az utolsó sor után
kat ./teszt | sed "1,4 route"1, 2, 3 és 4 sor után
kat ./teszt | sed "/syslog/r out"syslogot tartalmazó sor után
Sorok törlése:
kat ./teszt | sed "/games/,/syslog/d"amelyek a játékokat és a syslog-ot tartalmazó sorok között vannak
kat ./teszt | sed "3,5d"3-tól 5-ig
kat ./teszt | "5,$d"5-től a végéig

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 - a 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 a gawk eszközöket. Itt a sed-re és a szövegmanipulációra fogunk összpontosítani, mivel ez egy nagyon fontos lépés a bash szkriptek fejlesztésének hatalmas területein való utazásunk során.

Most elemezzük a sed-vel való munkavégzés alapjait, valamint 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 olyan interaktív szövegszerkesztők, mint 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ó, lentebb), a minta1-nek megfelelő minta2-vel.

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 ugyanazt a megközelítést alkalmazzuk, mint fentebb, de most a sed feldolgozza a fájlban tárolt szöveget. Ha azonban a fájl elég nagy, akkor észreveheti, hogy a sed darabokban dolgozza fel az adatokat, és megjeleníti a képernyőn a feldolgozott adatokat 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/This/That/; s/teszt/egy másik teszt/" ./myfile


A -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.


A sed-vel való munka másik módja

Parancsok olvasása fájlból

Ha sok sed paranccsal lehet szöveget feldolgozni, általában jobb, ha először kiírja őket egy fájlba. A parancsokat tartalmazó fájl sed-nek az -f kapcsolójával közölheti:

Íme a mycommands fájl tartalma:

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

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


Fájl használata parancsokkal 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ájl jelző 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 ki 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 kiadásá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 a sed ebben a konfigurációban történő futtatásakor 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épzelje el, hogy az /etc/passwd fájlban a /bin/bash helyére cseréli a /bin/csh-t. A feladat nem olyan nehéz:

$ sed "s/\/bin\/bash/\/bin\/csh/" /etc/passwd
Azonban nem néz ki túl jól. A helyzet az, hogy mivel a perjeleket elválasztó karakterként használják, 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 bizonyos 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. A sorozat következő cikkeinek egyikében fogunk róluk beszélni.

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ünk 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, az adatfolyam ö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 - azok 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 segítségével

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 ú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 hozzá 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, ha megadjuk a folyamban található hivatkozási sor számát, vagy a sablont. 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ő egy ú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 egyszerű szöveg formájában sablont használ a parancs meghívásakor, ill reguláris kifejezés, a mintának megfelelő összes karakterlánc 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 figyelembe kell venni, hogy a teljes szövegfolyamra vonatkozik, 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

A folyamszerkesztő a sorszámokat a tartalom előtt adta ki.

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, hogy a megadott fájlból adatokat szúrjon be 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 került beszúrásra.

Í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.

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 - a 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 a gawk eszközöket. Itt a sed-re és a szövegmanipulációra fogunk összpontosítani, mivel ez egy nagyon fontos lépés a bash szkriptek fejlesztésének hatalmas területein való utazásunk során.

Most elemezzük a sed-vel való munkavégzés alapjait, valamint 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 olyan interaktív szövegszerkesztők, mint 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ó, lentebb), a minta1-nek megfelelő minta2-vel.

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 ugyanazt a megközelítést alkalmazzuk, mint fentebb, de most a sed feldolgozza a fájlban tárolt szöveget. Ha azonban a fájl elég nagy, akkor észreveheti, hogy a sed darabokban dolgozza fel az adatokat, és megjeleníti a képernyőn a feldolgozott adatokat 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 részét, amely a bemeneti és kimeneti adatfolyamok átirányításával foglalkozik, akkor ezt meg kell tudnia tenni.

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

Ha több műveletet szeretne végrehajtani az adatokon, használja 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/This/That/; s/teszt/egy másik teszt/" ./myfile


A -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.


A sed-vel való munka másik módja

Parancsok olvasása fájlból

Ha sok sed paranccsal lehet szöveget feldolgozni, általában jobb, ha először kiírja őket egy fájlba. A parancsokat tartalmazó fájl sed-nek az -f kapcsolójával közölheti:

Íme a mycommands fájl tartalma:

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

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


Fájl használata parancsokkal 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ájl jelző 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 ki 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 kiadásá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 a sed ebben a konfigurációban történő futtatásakor 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 kimenetre kerülnek, míg a feldolgozott sorok abba a fájlba íródnak, amelynek a neve w után van megadva.

Határoló karakterek

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

$ sed "s/\/bin\/bash/\/bin\/csh/" /etc/passwd
Azonban nem néz ki túl jól. A helyzet az, hogy mivel a perjeleket elválasztó karakterként használják, 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 bizonyos 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. A sorozat következő cikkeinek egyikében fogunk róluk beszélni.

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ünk 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, az adatfolyam ö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 - azok 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 segítségével

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 ú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 hozzá 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, ha megadjuk a folyamban található hivatkozási sor számát, vagy a sablont. 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ő egy ú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 figyelembe kell venni, hogy a teljes szövegfolyamra vonatkozik, 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

A folyamszerkesztő a sorszámokat a tartalom előtt adta ki.

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, hogy a megadott fájlból adatokat szúrjon be 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 került beszúrásra.

Í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.


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 alapszintű Linux ismeretekkel, é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 bemutatjuk az alapvető fogalmakat, é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 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ítve van a GNU sed 4.2.1, valamint egy hivatkozás a program kezdőlapjára és egyéb hasznos információk. 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. Vegye figyelembe, 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 az összes helyettesítést végrehajtotta. 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"-t írt, és mindkét esetet kezelni szeretné, akkor a sed "s/Nick/nick/John/g" parancsot kell használnia. A függőleges sávnak van egy jelentése, amit tudnia kell, ha tanulta a C nyelvet, vagyis a kifejezése megegyezik a "nick" vagy a "nick" kifejezéssel. Amint alább látni fogja, a csatorna más módon is használható, de a jelenté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 (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 napjaiban 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, és különféle fuzzy reguláris kifejezések 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” szöveggel 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 Kinyomtatja a teljes file.txt fájlt, 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 lecseréli az unos kis- és nagybetűkre nem érzékenyre, í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]*$//" fájl.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" fájl.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 ki 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 fájllá konvertálásához függőleges sáv elválasztójellel (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 Johnsont White-ra változtatja csak az 1-20. sorban.
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 fordulatszám 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 parancs cseréje
sed "$!N; s/^\(.*\)\n\1$/\1/;\ t; D" file.txt Fordított parancs (egyenértékű az uniq -d-vel)
sed "$!N;$!D" 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
sed "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" [e-mail védett]/usr/ [e-mail védett]&/[e-mail védett]"útvonal.txt A /usr/bin lecseréli a /usr/bin/local fájlra a path.txt fájlban
sed" [e-mail védett]^.*[e-mail védett]<<<&>>>@g"path.txt Próbáld ki és meglátod :)
sed "s/\(\/[^:]*\).*/\1/g" path.txt Ha 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” karakteres sorral végződő szövegtömbökben.
sed -e "/^#/d" /etc/services/more Megjeleníti a szolgáltatásfájlt megjegyzés nélküli sorok nélkül
sed" [e-mail védett]\([^:]*\):\([^:]*\):\([^:]*\)@\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/" Számozza meg a sorokat 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 elmondhatnánk, de ez a cikksorozat inkább egy útmutató, amely reményeink szerint segít értékelni a Unix segédprogramok teljes erejét, és hatékonyabbá teszi munkáját.