Si të përdorni komandën sed në Linux


Mund të duket e çmendur, por komanda Linux sed është një redaktues teksti pa një ndërfaqe. Mund ta përdorni nga linja e komandës për të manipuluar tekstin në skedarë dhe transmetime. Ne do t'ju tregojmë se si ta shfrytëzoni fuqinë e tij.

Fuqia e sed

Komanda sed është paksa si shahu: duhet një orë për të mësuar bazat dhe një jetë për t'i zotëruar ato (ose, të paktën shumë praktikë). Ne do t'ju tregojmë një përzgjedhje të lojërave hapëse në secilën nga kategoritë kryesore të funksionalitetit sed.

sed është një redaktues transmetimi që funksionon në hyrje me tubacion ose skedarë teksti. Sidoqoftë, ai nuk ka një ndërfaqe ndërvepruese të redaktuesit të tekstit. Përkundrazi, ju jepni udhëzime që ai të ndiqet ndërsa funksionon përmes tekstit. E gjithë kjo funksionon në Bash dhe predha të tjera të linjës së komandës.

Me sed mund të bëni të gjitha sa vijon:

  • Zgjidh tekstin
  • Zëvendëso tekst
  • Shto rreshta në tekst
  • Fshi rreshtat nga teksti
  • Ndrysho (ose ruaj) një skedar origjinal

Ne i kemi strukturuar shembujt tanë për të prezantuar dhe demonstruar koncepte, jo për të prodhuar komandat më të shkurtra (dhe më pak të arritshme) sed. Megjithatë, funksionalitetet e përputhjes së modelit dhe përzgjedhjes së tekstit të sed bazohen shumë në shprehjet e rregullta (regexes). Ju do të keni nevojë për njohje me këto për të përfituar sa më mirë nga sed.

Një shembull i thjeshtë

Së pari, ne do të përdorim echo për të dërguar pak tekst te sed përmes një tubi dhe do të kemi sed zëvendësuar një pjesë të tekstit. Për ta bërë këtë, ne shtypim sa vijon:

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

Komanda echo dërgon howtogonk në sed dhe zbatohet rregulli ynë i thjeshtë i zëvendësimit (s do të thotë zëvendësim). sed kërkon në tekstin hyrës për një ndodhje të vargut të parë dhe do të zëvendësojë çdo përputhje me të dytën.

Vargu gonk zëvendësohet me geek dhe vargu i ri printohet në dritaren e terminalit.

Zëvendësimet janë ndoshta përdorimi më i zakonshëm i sed. Megjithatë, përpara se të zhytemi më thellë në zëvendësime, duhet të dimë se si të zgjedhim dhe përputhim tekstin.

Përzgjedhja e tekstit

Ne do të na duhet një skedar teksti për shembujt tanë. Ne do të përdorim një që përmban një përzgjedhje vargjesh nga poema epike e Samuel Taylor Coleridge The Rime of the Ancient Mariner.

Shkruajmë sa vijon për t'i hedhur një sy me më pak:

less coleridge.txt

Për të zgjedhur disa rreshta nga skedari, ne ofrojmë linjat e fillimit dhe të fundit të diapazonit që duam të zgjedhim. Një numër i vetëm zgjedh atë një rresht.

Për të nxjerrë rreshtat një deri në katër, ne shtypim këtë komandë:

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

Vini re presjen midis 1 dhe 4. p do të thotë printoni linja të përputhura. Si parazgjedhje, sed shtyp të gjitha rreshtat. Ne do të shihnim të gjithë tekstin në skedar me linjat që përputhen të shtypura dy herë. Për ta parandaluar këtë, ne do të përdorim opsionin -n (i qetë) për të shtypur tekstin e pakrahasueshëm.

Ne i ndryshojmë numrat e rreshtave që të mund të zgjedhim një varg tjetër, siç tregohet më poshtë:

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

Mund të përdorim opsionin -e (shprehje) për të bërë zgjedhje të shumta. Me dy shprehje, ne mund të zgjedhim dy vargje, si kjo:

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

Nëse zvogëlojmë numrin e parë në shprehjen e dytë, mund të fusim një bosh midis dy vargjeve. Ne shtypim sa vijon:

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

Mund të zgjedhim gjithashtu një vijë fillestare dhe t'i themi sed të kalojë nëpër skedar dhe të printojë linja alternative, çdo rresht të pestë, ose të kapërcejë çdo numër rreshtash. Komanda është e ngjashme me ato që kemi përdorur më sipër për të zgjedhur një varg. Këtë herë, megjithatë, ne do të përdorim një tildë (~) në vend të një presje për të ndarë numrat.

Numri i parë tregon vijën e fillimit. Numri i dytë tregon sed cilat rreshta pas vijës së fillimit duam të shohim. Numri 2 do të thotë çdo rresht i dytë, 3 do të thotë çdo rresht i tretë, e kështu me radhë.

Ne shtypim sa vijon:

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

Ju nuk do ta dini gjithmonë se ku ndodhet teksti që kërkoni në skedar, që do të thotë se numrat e rreshtave nuk do të ndihmojnë gjithmonë. Megjithatë, mund të përdorësh gjithashtu sed për të zgjedhur rreshta që përmbajnë modele teksti që përputhen. Për shembull, le të nxjerrim të gjitha rreshtat që fillojnë me Dhe.

Caret (^) përfaqëson fillimin e rreshtit. Ne do ta mbyllim termin tonë të kërkimit në vija të pjerrëta përpara (/). Ne përfshijmë gjithashtu një hapësirë pas Dhe kështu që fjalët si Android nuk do të përfshihen në rezultat.

Leximi i skripteve sed mund të jetë pak i vështirë në fillim. /p do të thotë print, ashtu siç bëri në komandat që përdorëm më sipër. Sidoqoftë, në komandën e mëposhtme, një prerje përpara i paraprin asaj:

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

Tre rreshta që fillojnë me Dhe nxirren nga skedari dhe shfaqen për ne.

Bërja e zëvendësimeve

Në shembullin tonë të parë, ne ju treguam formatin bazë të mëposhtëm për një zëvendësim sed:

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

s tregon sed ky është një zëvendësim. Vargu i parë është modeli i kërkimit dhe i dyti është teksti me të cilin duam të zëvendësojmë atë tekst të përputhur. Sigurisht, si me të gjitha gjërat Linux, djalli është në detaje.

Ne shtypim sa vijon për të ndryshuar të gjitha dukuritë e ditës në javë dhe për t'i dhënë marinarëve dhe albatrosit më shumë kohë për t'u lidhur:

sed -n 's/day/week/p' coleridge.txt

Në rreshtin e parë, ndryshohet vetëm shfaqja e dytë e ditës. Kjo ndodh sepse sed ndalon pas ndeshjes së parë për rresht. Duhet të shtojmë një g në fund të shprehjes, siç tregohet më poshtë, për të kryer një kërkim global në mënyrë që të përpunohen të gjitha ndeshjet në secilën rresht:

sed -n 's/day/week/gp' coleridge.txt

Kjo përputhet me tre nga katër në rreshtin e parë. Për shkak se fjala e parë është Ditë dhe sed është e ndjeshme ndaj shkronjave të vogla, ajo nuk e konsideron atë shembull si ditë.

Ne shtypim sa vijon, duke shtuar një i në komandën në fund të shprehjes për të treguar pandjeshmërinë ndaj shkronjave të vogla:

sed -n 's/day/week/gip' coleridge.txt

Kjo funksionon, por mund të mos dëshironi gjithmonë të aktivizoni pandjeshmërinë ndaj rasteve për çdo gjë. Në ato raste, ju mund të përdorni një grup regex për të shtuar pandjeshmërinë ndaj rasteve specifike për modelin.

Për shembull, nëse i mbyllim karakteret në kllapa katrore ([]), ato interpretohen si çdo karakter nga kjo listë karakteresh.

Ne shtypim sa vijon dhe përfshijmë D dhe d në grup, për t'u siguruar që përputhet me Ditën dhe Ditën:

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

Ne gjithashtu mund të kufizojmë zëvendësimet në seksione të skedarit. Le të themi se skedari ynë përmban hapësira të çuditshme në vargun e parë. Ne mund të përdorim komandën e mëposhtme të njohur për të parë vargun e parë:

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

Ne do të kërkojmë për dy hapësira dhe do t'i zëvendësojmë ato me një. Ne do ta bëjmë këtë globalisht në mënyrë që veprimi të përsëritet në të gjithë linjën. Për të qenë të qartë, modeli i kërkimit është hapësira, ylli i hapësirës (*) dhe vargu i zëvendësimit është një hapësirë e vetme. 1,4 kufizon zëvendësimin në katër rreshtat e parë të skedarit.

Ne i bashkojmë të gjitha këto në komandën e mëposhtme:

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

Kjo funksionon bukur! Modeli i kërkimit është ajo që është e rëndësishme këtu. Ylli (*) përfaqëson zero ose më shumë të karakterit të mëparshëm, që është një hapësirë. Kështu, modeli i kërkimit po kërkon vargje të një hapësire ose më shumë.

Nëse zëvendësojmë një hapësirë të vetme për çdo sekuencë të hapësirave të shumta, do ta kthejmë skedarin në hapësirë të rregullt, me një hapësirë të vetme midis çdo fjale. Kjo gjithashtu do të zëvendësojë një hapësirë të vetme për një hapësirë të vetme në disa raste, por kjo nuk do të ndikojë negativisht - ne do të marrim përsëri rezultatin tonë të dëshiruar.

Nëse shtypim sa vijon dhe reduktojmë modelin e kërkimit në një hapësirë të vetme, do të shihni menjëherë pse duhet të përfshijmë dy hapësira:

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

Për shkak se ylli përputhet me zero ose më shumë nga karakteri i mëparshëm, ai e sheh çdo karakter që nuk është hapësirë si një hapësirë zero dhe zbaton zëvendësimin për të.

Megjithatë, nëse përfshijmë dy hapësira në modelin e kërkimit, sed duhet të gjejë të paktën një karakter hapësirë përpara se të zbatojë zëvendësimin. Kjo siguron që karakteret pa hapësirë do të mbeten të paprekura.

Ne shtypim sa vijon, duke përdorur -e (shprehjen) që kemi përdorur më parë, e cila na lejon të bëjmë dy ose më shumë zëvendësime njëkohësisht:

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

Mund të arrijmë të njëjtin rezultat nëse përdorim një pikëpresje (;)  për të ndarë dy shprehjet, si:

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

Kur këmbyem ditë me javë në komandën e mëposhtme, shembulli i ditës në shprehjen pus një ditë u këmbye gjithashtu:

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

Për ta parandaluar këtë, ne mund të përpiqemi vetëm të zëvendësojmë linjat që përputhen me një model tjetër. Nëse modifikojmë komandën për të pasur një model kërkimi në fillim, ne do të konsiderojmë funksionimin vetëm në linja që përputhen me atë model.

Ne shtypim sa vijon për ta bërë modelin tonë të përputhjes me fjalën pas:

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

Kjo na jep përgjigjen që duam.

Zëvendësime më komplekse

Le t'i japim Coleridge një pushim dhe të përdorim sed për të nxjerrë emrat nga skedari etc/passwd.

Ka mënyra më të shkurtra për ta bërë këtë (më shumë për këtë më vonë), por ne do të përdorim rrugën më të gjatë këtu për të demonstruar një koncept tjetër. Çdo artikull i përputhur në një model kërkimi (të quajtur nënshprehje) mund të numërohet (maksimumi deri në nëntë artikuj). Më pas mund t'i përdorni këta numra në komandat tuaja sed për t'iu referuar nënshprehjeve specifike.

Duhet të mbyllni nënshprehjen në kllapa [()] që kjo të funksionojë. Kllapat gjithashtu duhet të paraprihen nga një vijë e pjerrët prapa (\) për të parandaluar që ato të trajtohen si një karakter normal.

Për ta bërë këtë, do të shkruani sa vijon:

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

Le ta zbërthejmë këtë:

  • sed s/: Komanda sed dhe fillimi i shprehjes së zëvendësimit.
  • \(: Kllapa hapëse [(] që mbyll nënshprehjen, e paraprirë nga një vijë e prapme (\ ).
  • [^:]*: Nënshprehja e parë e termit të kërkimit përmban një grup në kllapa katrore. Caret (^) do të thotë jo kur përdoret në një grup. Një grup do të thotë çdo karakter që nuk është dy pika (:) do të pranohet si përputhje.
  • \): Kllapa mbyllëse [)] me një vijë të prapme të mëparshme (\). li>
  • .*: Kjo nënshprehje e dytë e kërkimit do të thotë çdo karakter dhe çdo numër i tyre.
  • / : Pjesa e zëvendësimit të shprehjes përmban 1 e paraprirë nga një vijë e prapme (\). Ky përfaqëson tekstin që përputhet me nënshprehjen e parë.
  • /: Prerja mbyllëse përpara (/) dhe thonjëza e vetme () përfundojnë sed.

E gjithë kjo do të thotë se ne do të kërkojmë ndonjë varg karakteresh që nuk përmban një dy pika (:), i cili do të jetë shembulli i parë i tekstit që përputhet. Pastaj, ne jemi duke kërkuar për ndonjë gjë tjetër në atë linjë, e cila do të jetë shembulli i dytë i tekstit që përputhet. Ne do të zëvendësojmë të gjithë rreshtin me tekstin që përputhej me nënshprehjen e parë.

Çdo rresht në skedarin /etc/passwd fillon me një emër përdoruesi të mbyllur me dy pika. Ne përputhim gjithçka deri në pikën e parë dhe më pas e zëvendësojmë atë vlerë për të gjithë rreshtin. Pra, ne kemi izoluar emrat e përdoruesve.

Më pas, ne do të mbyllim nënshprehjen e dytë në kllapa [()] në mënyrë që të mund ta referojmë atë edhe me numër. Ne do të zëvendësojmë gjithashtu  me . Komanda jonë tani do të zëvendësojë të gjithë rreshtin me gjithçka nga dy pika e parë (:) deri në fund të rreshtit.

Ne shtypim sa vijon:

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

Këto ndryshime të vogla përmbysin kuptimin e komandës dhe ne marrim gjithçka përveç emrave të përdoruesve.

Tani, le të hedhim një vështrim në mënyrën e shpejtë dhe të lehtë për ta bërë këtë.

Termi ynë i kërkimit është nga dy pika e parë (:) deri në fund të rreshtit. Për shkak se shprehja jonë e zëvendësimit është bosh (//), ne nuk do ta zëvendësojmë tekstin e përputhur me asgjë.

Pra, ne shtypim sa vijon, duke copëtuar gjithçka nga dy pika e parë (:) deri në fund të rreshtit, duke lënë vetëm emrat e përdoruesve:

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

Le të shohim një shembull në të cilin referojmë ndeshjet e para dhe të dyta në të njëjtën komandë.

Ne kemi një skedar me presje (,) që ndan emrat dhe mbiemrat. Ne duam t'i renditim ato si mbiemri, emri. Ne mund të përdorim cat, siç tregohet më poshtë, për të parë se çfarë ka në skedar:

cat geeks.txt

Ashtu si shumë komanda sed, kjo e radhës mund të duket e padepërtueshme në fillim:

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

Kjo është një komandë zëvendësimi si të tjerat që kemi përdorur, dhe modeli i kërkimit është mjaft i lehtë. Do ta zbërthejmë më poshtë:

  • s/: Komanda normale e zëvendësimit.
  • ^: Për shkak se karteli nuk është në grup ([]), do të thotë Fillimi i linjës.
  • \(.*\),: Nënshprehja e parë është çdo numër i çdo karakteri. Është mbyllur në kllapa [()], secila prej të cilave paraprihet nga një vijë e prapme (\), kështu që ne mund ta referojmë atë me numër. I gjithë modeli ynë i kërkimit deri tani përkthehet si kërkim nga fillimi i rreshtit deri në presjen e parë (,) për çdo numër të çdo karakteri.
  • \(.*\): Nënshprehja tjetër është (përsëri) çdo numër i çdo karakteri. Është gjithashtu i mbyllur në kllapa [()], të dyja paraprihen nga një vijë e prapme (\), kështu që ne mund t'i referohemi tekstit që përputhet me numër.
  • $/: Shenja e dollarit ($) përfaqëson fundin e rreshtit dhe do të lejojë që kërkimi ynë të vazhdojë deri në fund të linja. Ne e kemi përdorur këtë thjesht për të prezantuar shenjën e dollarit. Nuk na nevojitet vërtet këtu, pasi ylli (*) do të shkonte në fund të rreshtit në këtë skenar. Vizita përpara (/) plotëson seksionin e modelit të kërkimit.
  • , /g: Për shkak se i kemi mbyllur dy nënshprehjet tona në kllapa, ne mund t'u referohemi të dyjave me numrat e tyre. Për shkak se ne duam të kthejmë rendin, i shtypim si second-match,first-match. Numrat duhet të paraprihen nga një vijë e prapme (\).
  • /g: Kjo mundëson që komanda jonë të funksionojë globalisht në secilën linjë.
  • geeks.txt: Skedari me të cilin po punojmë.

Ju gjithashtu mund të përdorni komandën Cut (c) për të zëvendësuar linja të tëra që përputhen me modelin tuaj të kërkimit. Ne shtypim sa vijon për të kërkuar një rresht me fjalën qafë në të dhe e zëvendësojmë atë me një varg të ri teksti:

sed '/neck/c Around my wrist was strung' coleridge.txt

Linja jonë e re tani shfaqet në fund të ekstraktit tonë.

Futja e rreshtave dhe tekstit

Ne gjithashtu mund të fusim rreshta dhe tekst të rinj në skedarin tonë. Për të futur rreshta të rinj pas çdo rreshti që përputhet, do të përdorim komandën Append (a).

Këtu është skedari me të cilin do të punojmë:

mace geeks.txt

Ne kemi numëruar rreshtat për ta bërë këtë pak më të lehtë për t'u ndjekur.

Ne shtypim sa vijon për të kërkuar rreshta që përmbajnë fjalën Ai dhe futim një rresht të ri poshtë tyre:

sed '/He/a --> Inserted!' geeks.txt

Ne shtypim sa vijon dhe përfshijmë komandën Fut (i) për të futur rreshtin e ri mbi ato që përmbajnë tekst që përputhet:

sed '/He/i --> Inserted!' geeks.txt

Mund të përdorim ampersand-in (&), i cili përfaqëson tekstin origjinal të përputhur, për të shtuar tekst të ri në një rresht që përputhet.  ,  , e kështu me radhë, përfaqësojnë nënshprehje që përputhen.

Për të shtuar tekst në fillim të një rreshti, ne do të përdorim një komandë zëvendësimi që përputhet me gjithçka në rresht, e kombinuar me një klauzolë zëvendësuese që kombinon tekstin tonë të ri me rreshtin origjinal.

Për të bërë të gjitha këto, ne shtypim sa vijon:

sed 's/.*/--> Inserted &/' geeks.txt

Ne shtypim sa vijon, duke përfshirë komandën G, e cila do të shtojë një vijë të zbrazët midis çdo rreshti:

sed 'G' geeks.txt

Nëse dëshironi të shtoni dy ose më shumë rreshta bosh, mund të përdorni G;GG;G;G, e kështu me radhë.

Fshirja e Linjave

Komanda Delete (d) fshin linjat që përputhen me një model kërkimi, ose ato të specifikuara me numra rreshtash ose vargje.

Për shembull, për të fshirë rreshtin e tretë, do të shkruanim sa vijon:

sed '3d' geeks.txt

Për të fshirë gamën e rreshtave katër deri në pesë, do të shkruanim sa vijon:

sed '4,5d' geeks.txt

Për të fshirë rreshtat jashtë një diapazoni, ne përdorim një pikëçuditëse (!), siç tregohet më poshtë:

sed '6,7!d' geeks.txt

Ruajtja e ndryshimeve tuaja

Deri më tani, të gjitha rezultatet tona janë printuar në dritaren e terminalit, por ne ende nuk i kemi ruajtur ato askund. Për t'i bërë këto të përhershme, mund t'i shkruani ndryshimet tuaja në skedarin origjinal ose t'i ridrejtoni ato në një të ri.

Mbishkrimi i skedarit tuaj origjinal kërkon kujdes. Nëse komanda juaj sed është e gabuar, mund të bëni disa ndryshime në skedarin origjinal që janë të vështira për t'u zhbërë.

Për pak qetësi, sed mund të krijojë një kopje rezervë të skedarit origjinal përpara se ai të ekzekutojë komandën e tij.

Mund të përdorni opsionin In-place (-i) për t'i thënë sed të shkruajë ndryshimet në skedarin origjinal, por nëse shtoni një shtesë skedari në të, sed do të rezervojë skedarin origjinal në një të ri. Do të ketë të njëjtin emër si skedari origjinal, por me një shtesë të re skedari.

Për të demonstruar, ne do të kërkojmë çdo rresht që përmban fjalën Ai dhe do t'i fshijmë ato. Ne gjithashtu do të rezervojmë skedarin tonë origjinal në një të ri duke përdorur shtesën BAK.

Për të bërë të gjitha këto, ne shtypim sa vijon:

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

Ne shtypim sa vijon për t'u siguruar që skedari ynë rezervë është i pandryshuar:

cat geeks.txt.bak

Ne gjithashtu mund të shtypim sa vijon për të ridrejtuar daljen në një skedar të ri dhe për të arritur një rezultat të ngjashëm:

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

Ne përdorim cat për të konfirmuar se ndryshimet janë shkruar në skedarin e ri, siç tregohet më poshtë:

cat new_geeks.txt

Duke sed gjithë atë

Siç e keni vënë re ndoshta, edhe kjo abetare e shpejtë në sed është mjaft e gjatë. Ka shumë për këtë komandë, dhe ka edhe më shumë që mund të bëni me të.

Megjithatë, shpresojmë se këto koncepte bazë kanë ofruar një bazë solide mbi të cilën mund të ndërtoni ndërsa vazhdoni të mësoni më shumë.

RELATED: Best Linux Laptops for Developers and Enthusiasts