Kaip naudoti „sed“ komandą „Linux“

Tai gali skambėti beprotiškai, bet „Linux“ sedkomanda yra teksto redaktorius be sąsajos. Galite naudoti jį naudodami komandinę eilutę, kad galėtumėte tvarkyti failų ir srautų tekstą. Mes jums parodysime, kaip panaudoti jo galią.

Sedos galia

sedKomanda yra kaip šachmatai tiek: jis trunka valandą išmokti pagrindus ir visą gyvenimą juos įvaldyti (arba bent jau daug praktikos). Parodysime pradinių lošimų pasirinkimą kiekvienoje iš pagrindinių sedfunkcijų kategorijų .

sedyra srauto redaktorius, veikiantis naudojant įvestį ar teksto failus. Tačiau jis neturi interaktyvios teksto rengyklės sąsajos. Verčiau pateikite instrukcijas, kaip ji turi laikytis, kai ji veikia per tekstą. Visa tai veikia „Bash“ ir kituose komandinės eilutės korpusuose.

Su sedjumis galite atlikti visus šiuos veiksmus:

  • Pasirinkite tekstą
  • Pakaitinis tekstas
  • Pridėkite eilučių prie teksto
  • Ištrinti eilutes iš teksto
  • Pakeiskite (arba išsaugokite) originalų failą

Mes susisteminome savo pavyzdžius tam, kad pristatytume ir pademonstruotume sąvokas, o ne tam, kad būtų sukurtos tersest (ir mažiausiai prieinamos) sedkomandos. Tačiau šablonų derinimo ir teksto pasirinkimo funkcijos sed labai priklauso nuo reguliariųjų išraiškų (regexes). Jums reikės šiek tiek susipažinti su jais, kad galėtumėte kuo geriau pasinaudoti sed.

SUSIJEDS: Kaip naudoti įprastus posakius (regexes) sistemoje „Linux“

Paprastas pavyzdys

Pirma, mes ketiname echosiųsti tekstą į sedpypkę ir sed pakeisti teksto dalį. Norėdami tai padaryti, įveskite:

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

echoKomanda siunčia "howtogonk" į sed, ir mūsų paprasta pakeisti taisyklė ( "S" reiškia keitimą) yra taikomas. sed ieško įvesties tekste pirmosios eilutės, o visas atitiktis pakeis antrąja.

Eilutė „gonk“ pakeičiama į „geek“, o nauja eilutė atspausdinama terminalo lange.

Bene dažniausiai naudojamas pakaitalas sed. Kad galėtume gilintis į pakeitimus, turime žinoti, kaip pasirinkti ir suderinti tekstą.

Teksto pasirinkimas

Mūsų pavyzdžiams reikės teksto failo. Mes naudosime vieną, kuriame yra eilių iš Samuelio Tayloro Coleridge'o eilėraščio „Senovės jūrininko rimas“.

Įveskite šiuos dalykus, kad galėtume į tai pažvelgti less:

mažiau coleridge.txt

Norėdami pasirinkti kelias eilutes iš failo, pateikiame norimo pasirinkti diapazono pradžios ir pabaigos eilutes. Vienas skaičius parenka tą vieną eilutę.

Norėdami išgauti eilutes nuo vienos iki keturių, įveskite šią komandą:

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

Atkreipkite dėmesį į kablelį tarp 1ir 4. Tai preiškia „atspausdinti suderintas linijas“. Pagal numatytuosius nustatymus  sed spausdina visas eilutes. Mes matėme visą failo tekstą su atitinkamomis eilutėmis, išspausdintus du kartus. Norėdami to išvengti, naudosime -nparinktį (tyli), kad sutramdytume nesuderintą tekstą.

Mes keičiame eilučių numerius, kad galėtume pasirinkti kitą eilutę, kaip parodyta žemiau:

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

Norėdami -epasirinkti kelis variantus, galime naudoti (išraiškos) parinktį. Su dviem posakiais galime pasirinkti dvi eiles, tokias:

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

Jei sumažinsime pirmąjį skaičių antroje išraiškoje, tarp dviejų eilučių galime įterpti tuščią vietą. Įrašome:

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

Mes taip pat galime pasirinkti pradinę eilutę ir liepti sed pereiti failą ir atspausdinti pakaitines eilutes kas penktą eilutę arba praleisti bet kokį eilučių skaičių. Komanda yra panaši į tuos, kuriuos naudojome aukščiau, norėdami pasirinkti diapazoną. Tačiau šį kartą ~skaičiams atskirti naudosime ne kablelį, o tildę ( ).

Pirmasis skaičius nurodo pradinę eilutę. Antrasis skaičius nurodo, sedkurias eilutes po pradinės linijos norime pamatyti. Skaičius 2 reiškia kiekvieną antrą eilutę, 3 reiškia kiekvieną trečią eilutę ir t.

Įrašome:

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

Ne visada žinosite, kur faile yra ieškomas tekstas, o tai reiškia, kad eilučių numeriai ne visada bus daug naudingi. Tačiau taip pat galite naudoti sed norėdami pasirinkti eilutes, kuriose yra atitinkančių teksto raštų. Pavyzdžiui, išskirkime visas eilutes, prasidedančias „Ir“.

„Caret“ ( ^) reiškia eilutės pradžią. Paieškos terminą pridėsime pasvirais brūkšneliais ( /). Mes taip pat įtraukiame tarpą po „And“, todėl tokie žodžiai kaip „Android“ nebus įtraukti į rezultatą.

Skaityti sedscenarijus iš pradžių gali būti šiek tiek sunku. Tai /p reiškia „spausdinti“, lygiai taip pat kaip ir anksčiau naudojamose komandose. Tačiau šioje komandoje priekinis pasvirasis brūkšnys yra prieš jį:

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

Trys eilutės, prasidedančios raide „Ir“, išimamos iš failo ir rodomos mums.

Pakeitimų atlikimas

Pirmajame pavyzdyje mes parodėme jums tokį pagrindinį pakeitimo formatą sed:

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

sPasakoja sed tai pakeisti. Pirmoji eilutė yra paieškos modelis, o antroji - tekstas, kuriuo norime pakeisti tą suderintą tekstą. Žinoma, kaip ir visuose „Linux“ dalykuose, velnias yra detalėse.

Mes įveskite šiuos duomenis, kad pakeistume visus „dienos“ atvejus į „savaitė“, ir jūrininkui bei albatrosui suteikiame daugiau laiko susirišti:

sed-n 's / diena / savaitė / p' coleridge.txt

Pirmoje eilutėje keičiamas tik antrasis „dienos“ atvejis. Taip yra todėl, kad sedsustoja po pirmųjų rungtynių. Išraiškos pabaigoje turime pridėti „g“, kaip parodyta žemiau, kad atliktume visuotinę paiešką, kad būtų apdorojamos visos kiekvienos eilutės atitiktys:

sed-n 's / diena / savaitė / gp' coleridge.txt

Tai atitinka tris iš keturių pirmoje eilėje. Kadangi pirmasis žodis yra „Diena“ ir sedjame skiriamos didžiosios ir mažosios raidės, jis nelaiko to paties atvejo kaip „diena“.

Įrašome šiuos veiksmus, i išraiškos pabaigoje pridėdami komandą a, nurodydami nejautrumą didžiosiomis ir mažosiomis raidėmis:

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

Tai veikia, bet galbūt ne visada norėsite viskam įjungti nejautrumą didžiosioms ir mažosioms raidėms. Tais atvejais galite naudoti regex grupę, kad pridėtumėte nejautrumo pagal modelį.

Pvz., Jei simbolius dedame kvadratiniuose skliaustuose ( []), jie interpretuojami kaip „bet kuris simbolis iš šio simbolių sąrašo“.

Įvedame šiuos dalykus ir įtraukiame „D“ ir „d“ į grupę, kad įsitikintume, jog jie atitinka „Diena“ ir „Diena“:

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

Mes taip pat galime apriboti pakeitimus failo dalimis. Tarkime, kad mūsų byloje pirmoje eilutėje yra keistų tarpų. Norėdami pamatyti pirmąją eilutę, galime naudoti šią įprastą komandą:

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

Ieškosime dviejų tarpų ir pakeisime juos viena. Tai atliksime visame pasaulyje, kad veiksmas būtų kartojamas visoje eilutėje. Kad būtų aišku, paieškos modelis yra tarpas, tarpo žvaigždutė ( *), o pakaitinė eilutė yra viena tarpas. 1,4Apriboja pakaitalą pirmąsias keturias eilutes faile.

Visa tai sujungėme į šią komandą:

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

Tai puikiai veikia! Čia svarbu paieškos modelis. Žvaigždutė ( *) žymi nulį ar daugiau ankstesnio simbolio, kuris yra tarpas. Taigi, ieškant modelio ieškoma vienos ar daugiau erdvių eilutės.

Jei pakeisime vieną tarpą bet kuria kelių tarpų seka, failas grįš į įprastus tarpus, tarp kiekvieno žodžio bus vienas tarpas. Kai kuriais atvejais tai taip pat pakeis vieną erdvę, tačiau tai nieko neigiamai nepaveiks - mes vis tiek gausime norimą rezultatą.

Jei įvesime šiuos duomenis ir sumažinsime paieškos modelį iki vienos vietos, iškart pamatysite, kodėl turime įtraukti du tarpus:

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

Kadangi žvaigždutė atitinka nulį ar daugiau ankstesnio simbolio, kiekvienas simbolis, kuris nėra tarpas, matomas kaip „nulio tarpas“ ir jam taikomas pakaitalas.

Tačiau jei į paieškos modelį įtrauksime dvi tarpus, prieš pritaikydami pakeitimą,  sedturite rasti bent vieną tarpo ženklą. Tai užtikrina, kad tarpai tarp simbolių nebus palikti.

Naudodami -eanksčiau naudojamą (išraišką), kuri leidžia mums atlikti du ar daugiau pakeitimų vienu metu:

sed -n -e's / motion / plazdėjimas / gip '-e' s / ocean / latakas / gip 'coleridge.txt

Tą patį rezultatą galime pasiekti, jei kabliataškiu ( ;) atskirsime abi išraiškas, taip:

sed -n 's / motion / plazdėjimas / gip; s / ocean / latakas / gip' coleridge.txt

Kai pakeisime „dieną“ į „savaitę“ šioje komandoje, taip pat buvo pakeistas „dienos“ pavyzdys posakyje „gerai diena“:

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

Norėdami to išvengti, mes galime bandyti pakeisti tik tas linijas, kurios atitinka kitą modelį. Jei modifikuosime komandą, kad pradžioje būtų paieškos modelis, svarstysime galimybę veikti tik tomis eilutėmis, kurios atitinka tą modelį.

Mes įvedame šiuos žodžius „po“, kad atitikimo modelis būtų toks:

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

Tai suteikia mums norimą atsakymą.

Sudėtingesni pakeitimai

Duokime Coleridge'ui pertraukėlę ir naudokime sedją išgauti vardus iš etc/passwdfailo.

Yra trumpesnių būdų tai padaryti (daugiau apie tai vėliau), tačiau čia mes naudosime ilgesnį kelią, kad pademonstruotume kitą koncepciją. Kiekvieną paieškos modelio atitiktą elementą (vadinamą posakiais) galima sunumeruoti (ne daugiau kaip devynis elementus). Tada galite naudoti šiuos skaičius savo  sedkomandose, norėdami nurodyti konkrečius posakius.

Norėdami, kad ()tai veiktų, turite papildomą išraišką skliausteliuose [ ]. Prieš skliaustus taip pat turi būti pasvirasis brūkšnys ( \), kad būtų išvengta jų traktuojimo kaip įprasto simbolio.

Norėdami tai padaryti, įveskite:

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

Išskaidykime tai:

  • sed 's/:sed Komandą ir pakeitimo raiškos pradžia.
  • \(: Pradinis skliaustas [ (], apimantis posakį, prieš kurį yra pasvirasis brūkšnys ( \).
  • [^:]*: Pirmajame paieškos termino išraiška kvadratiniuose skliaustuose yra grupė. „Caret“ ( ^) reiškia „ne“, kai naudojamas grupėje. Grupė reiškia, kad bet koks simbolis, kuris nėra dvitaškis ( :), bus priimtas kaip atitikmuo.
  • \): Uždaromas skliaustas [ )] su priešingu pasviruoju brūkšniu ( \).
  • .*: Šis antrasis paieškos posakis reiškia „bet kokį simbolį ir bet kokį jų skaičių“.
  • /\1: Pakaitinėje išraiškos dalyje yra 1atgalinis pasvirasis brūkšnys ( \). Tai reiškia tekstą, kuris atitinka pirmąjį posakį.
  • /': Uždaromas pasvirasis brūkšnys ( /) ir viena citata ( ') nutraukia sedkomandą.

Ką visa tai reiškia, mes ieškosime bet kokios simbolių eilutės, kurioje nėra dvitaškio ( :), kuri bus pirmasis atitikimo teksto atvejis. Tada toje eilutėje ieškome bet ko kito, o tai bus antrasis atitikimo teksto atvejis. Mes pakeisime visą eilutę tekstu, kuris atitiko pirmąjį posakį.

Kiekviena /etc/passwdfailo eilutė prasideda dvitaškiu užbaigtu vartotojo vardu. Viską suderiname iki pirmojo dvitaškio ir tada pakeičiame šią vertę visai eilutei. Taigi, mes išskyrėme naudotojo vardus.

Tada mes pridėsime antrąjį posakį skliaustuose [ ()], kad galėtume jį nurodyti ir skaičiumi. Mes taip pat pakeisti \1 su \2. Dabar mūsų komanda pakeis visą eilutę nuo pirmojo dvitaškio ( :) iki eilutės pabaigos.

Įrašome:

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

Tie maži pakeitimai apvers komandos prasmę ir mes gausime viską, išskyrus vartotojo vardus.

Pažvelkime į greitą ir paprastą būdą tai padaryti.

Mūsų paieškos terminas yra nuo pirmojo dvitaškio ( :) iki eilutės pabaigos. Kadangi mūsų pakaitinė išraiška yra tuščia ( //), suderinto teksto niekuo nepakeisime.

Taigi, mes įvedame šiuos veiksmus, supjaustydami viską nuo pirmojo dvitaškio ( :) iki eilutės pabaigos, palikdami tik naudotojo vardus:

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

Pažvelkime į pavyzdį, kuriame mes nurodome pirmąją ir antrąją rungtis toje pačioje komandoje.

Mes turime kablelių failą ( ,), atskiriantį vardus ir pavardes. Norime juos išvardyti kaip „pavardė, vardas“. catKaip parodyta žemiau, galime naudoti  norėdami pamatyti, kas yra faile:

katės geeks.txt

Kaip ir daugybė sedkomandų, ši kita iš pradžių gali atrodyti neįveikiama:

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

Tai yra pakeitimo komanda, kaip ir kitos, kurias mes naudojome, ir paieškos modelis yra gana lengvas. Mes suskirstysime toliau:

  • sed 's/: Įprasta pakeitimo komanda.
  • ^: Kadangi laikinasis nėra grupėje ( []), tai reiškia „eilutės pradžia“.
  • \(.*\),: Pirmasis posakis yra bet koks simbolių skaičius. Jis uždarytas skliaustuose [ ()], prieš kiekvieną iš jų yra atgalinis brūkšnys ( \), kad galėtume jį nurodyti pagal skaičių. Visas mūsų paieškos modelis iki šiol reiškia ,bet kokio simbolių skaičiaus paiešką nuo eilutės pradžios iki pirmojo kablelio ( ).
  • \(.*\):  Kitas posakis yra (vėl) bet koks bet kurio simbolio skaičius. Jis taip pat uždarytas skliausteliuose [ ()], prieš juos abu yra pasvirasis pasvirasis brūkšnys ( \), kad atitinkantį tekstą galėtume nurodyti pagal skaičių.
  • $/: Dolerio ženklas ( $) reiškia eilutės pabaigą ir leis mūsų paiešką tęsti iki eilutės pabaigos. Mes tai panaudojome tiesiog norėdami įvesti dolerio ženklą. Čia mums to tikrai nereikia, nes *šiame scenarijuje žvaigždutė ( ) eitų į eilutės pabaigą. Pasvirasis pasvirasis brūkšnys ( /) užbaigia paieškos modelio skyrių.
  • \2,\1 /g': Kadangi mes skliaustuose uždarėme du savo posakius, galime juos abu nurodyti skaičiais. Kadangi mes norime pakeisti tvarką, mes juos įveskite kaip second-match,first-match. Prieš skaičius turi būti pasvirasis brūkšnys ( \).
  • /g: Tai leidžia mūsų komandai dirbti globaliai kiekvienoje eilutėje.
  • geeks.txt: Failas, kurį dirbame.

Taip pat galite naudoti komandą Cut ( c), kad pakeistumėte visas eilutes, atitinkančias jūsų paieškos modelį. Mes ieškome eilutės su žodžiu „kaklas“ ir įveskite šią teksto eilutę:

sed '/ kaklas / c Aplink mano riešą buvo suverta' coleridge.txt

Mūsų naujoji eilutė dabar rodoma ištraukos apačioje.

Linijų ir teksto įterpimas

Taip pat į savo failą galime įterpti naujų eilučių ir teksto. Norėdami įterpti naujas eilutes po bet kokių atitinkančių, naudosime komandą „Pridėti“ ( a).

Čia yra failas, su kuriuo dirbsime:

katės geeks.txt

Mes suskaičiavome eilutes, kad būtų lengviau tai sekti.

Mes ieškome eilučių, kuriose yra žodis „Jis“, ir po jomis įterpiame naują eilutę:

sed '/ He / a -> Įterpta!' geeks.txt

Įrašome šiuos dalykus ir įtraukiame komandą „Įterpti“ ( i), kad įterptumėte naują eilutę virš tų, kuriuose yra atitinkantis tekstas:

sed '/ He / i -> Įterpta!' geeks.txt

Norėdami &pridėti naują tekstą prie atitinkančios eilutės, galime naudoti ampersandą ( ), kuris reiškia originalų suderintą tekstą. \1 ,  \2ir t. t., rodo atitinkančius išraiška.

Norėdami pridėti teksto prie eilutės pradžios, naudosime komandą, pakeičiančią viską, kas yra eilutėje, kartu su pakeitimo sąlyga, kuri sujungia mūsų naują tekstą su pradine eilute.

Norėdami tai padaryti, įveskite:

sed 's /.*/--> Įterpta & /' geeks.txt

Įrašome taip, įskaitant Gkomandą, kuri tarp kiekvienos eilutės pridės tuščią eilutę:

sed 'G' geeks.txt

Jei norite pridėti dvi ar daugiau tuščių eilučių, galite naudoti G;GG;G;Gir taip toliau.

Ištrinamos eilutės

Komanda „Delete“ ( d) ištrina eilutes, atitinkančias paieškos modelį, arba tas, kurios nurodytos eilutės numeriais ar diapazonais.

Pvz., Norėdami ištrinti trečią eilutę, įveskite:

sed '3d' geeks.txt

Norėdami ištrinti keturių – penkių eilučių diapazoną, įveskite:

sed '4,5d' geeks.txt

Norėdami ištrinti linijas, esančias už diapazono ribų, naudojame šauktuką ( !), kaip parodyta žemiau:

sed '6,7! d' geeks.txt

Savo pakeitimų išsaugojimas

Iki šiol visi mūsų rezultatai buvo atspausdinti terminalo lange, tačiau jų dar niekur neišsaugojome. Norėdami, kad jie būtų nuolatiniai, galite arba parašyti pakeitimus į pradinį failą, arba peradresuoti juos į naują.

Perrašant originalų failą reikia būti atsargiems. Jei jūsų sedkomanda neteisinga, galite atlikti keletą originalaus failo pakeitimų, kuriuos sunku anuliuoti.

Kad būtų ramiau, sed prieš vykdydami komandą , galite sukurti originalaus failo atsarginę kopiją.

Galite naudoti parinktį Vietoje ( -i),  sedkad nurodytumėte parašyti originalaus failo pakeitimus, tačiau jei prie jo pridėsite failo plėtinį, sed originalioji failo kopija bus nauja. Jis turės tą patį pavadinimą, kaip ir pradinis failas, tačiau su nauju failo plėtiniu.

Norėdami parodyti, mes ieškosime bet kurios eilutės, kuriose yra žodis „Jis“, ir jas ištrinsime. Mes taip pat sukursime originalios failo atsargines kopijas į naują, naudodami BAK plėtinį.

Norėdami tai padaryti, įveskite:

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

Mes įveskite šiuos duomenis, kad įsitikintume, jog atsarginės kopijos failas nepakito:

kačių geeks.txt.bak

Mes taip pat galime įvesti šiuos veiksmus, kad nukreiptume išvestį į naują failą ir pasiektume panašų rezultatą:

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

Mes catpatvirtiname, kad pakeitimai buvo parašyti naujame faile, kaip parodyta žemiau:

katė new_geeks.txt

Suvedęs visa tai

Kaip tikriausiai pastebėjote, net ir šis greitas gruntas sedyra gana ilgas. Ši komanda turi daug ir dar daugiau galite padaryti su ja.

Tikimės, kad šios pagrindinės sąvokos suteikė tvirtą pagrindą, kurį galite sukurti toliau mokydamiesi daugiau.