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:
- 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
[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ó
Sed -i "5,10d"
Ez a parancs a fájlban található
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
SED | Leí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.
$ 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.
$ 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.
$ 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.
$ 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.
$ 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.
$ 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.
Hogyan távolítsuk el a port az iPhone kamerájáról?
Vírus Petya: a csatatér - Rosneft
Miért nem működik a GPS Androidon A GPS nem működik okostelefonon
Megoldva - miért nincsenek telepítve az alkalmazások az Androidra
Hangalapú keresés a Yandexben