Kuidas kasutada sed-käsku Linuxis

See võib tunduda hullumeelsena, aga Linux sed käsk on liideseta tekstiredaktor. Saate seda kasutada käsurealt failide ja voogude teksti manipuleerimiseks. Näitame teile, kuidas selle võimu rakendada.

Sed. Jõud

The sed käsk on natuke nagu male: põhitõdede õppimine võtab tund aega ja nende omandamine (või vähemalt palju harjutamist) kogu elu. Näitame teile valikut avamängudest igas peamises kategoorias sed funktsionaalsus.

sed on voo redaktor, mis töötab torustiku sisendi või tekstifailidega. Sellel pole aga interaktiivset tekstiredaktori liidest. Pigem annate juhised selle järgimiseks, kui see teksti läbi töötab. See kõik töötab Bashis ja muudes käsurea kestades.

Koos sed saate teha kõiki järgmisi toiminguid:

  • Valige tekst
  • Asendustekst
  • Lisage tekstile read
  • Kustuta tekstist read
  • Originaalfaili muutmine (või säilitamine)

Oleme struktureerinud oma näited kontseptsioonide tutvustamiseks ja tutvustamiseks, mitte kõige tihedama (ja kõige vähem ligipääsetava) tootmiseks sed käsud. Kuid mustri sobitamine ja teksti valimise funktsioonid sed tugineda suurel määral regulaaravaldistele (regexes). Parima tulemuse saavutamiseks vajate nende tundmist sed.

SEOTUD:Regulaaravaldiste (regexes) kasutamine Linuxis

Lihtne näide

Esiteks hakkame kasutama kaja teksti saatmiseks sed läbi toru ja on sed osa tekstist. Selleks sisestame järgmise teksti:

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

The kaja käsk saadab "howtogonk" sedja rakendatakse meie lihtsat asendusreeglit (s tähistab asendamist).sed otsib sisendtekstist esimese stringi esinemist ja asendab kõik vasted teisega.

String “gonk” asendatakse sõnaga “geek” ja terminali aknasse trükitakse uus string.

Asendused on ilmselt kõige levinum kasutamine sed. Enne kui saame sukelduda sügavamalt asendustesse, peame siiski teadma, kuidas teksti valida ja sobitada.

Teksti valimine

Näidete jaoks vajame tekstifaili. Kasutame ühte, mis sisaldab valikut värsse Samuel Taylor Coleridge'i eepilisest luuletusest "Muistse Marineri riim".

Selle vaatamiseks kirjutame järgmise vähem:

vähem coleridge.txt

Mõne rea valimiseks failist pakume valitud vahemiku algus- ja lõpurida. Selle ühe rea valib üks number.

Ridade üks kuni neli väljavõtmiseks sisestame selle käsu:

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

Pange tähele koma vahel 1 ja 4. The lk tähendab "sobitatud joonte printimist". Algselt,sed prindib kõik read. Me näeksime kogu faili teksti koos vastavate joontega kaks korda. Selle vältimiseks kasutame -n (vaikne) variant sobimatu teksti mahasurumiseks.

Muudame ridade numbreid, et saaksime valida teise salmi, nagu allpool näidatud:

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

Saame kasutada -e (avaldis) võimalus teha mitu valikut. Kahe väljendi abil saame valida kaks salmi, näiteks:

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

Kui vähendame teise avaldise esimest arvu, võime kahe salmi vahele lisada tühiku. Sisestame järgmise:

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

Saame valida ka stardijoone ja öelda sed failis sirvimiseks ja vahelduvate ridade printimiseks, iga viies rida, või suvalise arvu ridade vahele jätmiseks. Käsk on sarnane nendega, mida kasutasime ülal vahemiku valimiseks. Seekord aga kasutame tildet (~) numbrite eraldamiseks koma asemel.

Esimene number tähistab stardirida. Teine number ütleb sed milliseid ridu pärast stardijooni tahame näha. Number 2 tähendab iga teist rida, 3 tähendab iga kolmandat rida jne.

Sisestame järgmise:

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

Te ei tea alati, kus failis otsitav tekst asub, mis tähendab, et reanumbritest pole alati palju abi. Kuid võite ka kasutada sed ridade valimiseks, mis sisaldavad vastavaid tekstimustreid. Näiteks eraldame kõik read, mis algavad tähega „Ja”.

Toon (^) tähistab rea algust. Lisame oma otsingutermini kaldkriipsudesse (/). Lisame tühiku „Ja” järel ka tühiku, nii et sõnu nagu „Android” ei kaasata tulemusse.

Lugemine sed skriptid võivad alguses olla natuke karmid. The / lk tähendab printimist, täpselt nagu seda tehti ülalkirjeldatud käskudes. Järgmises käsus eelneb sellele aga kaldkriips:

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

Kolm rida, mis algavad tähega “And”, tõmmatakse failist välja ja kuvatakse meile.

Asenduste tegemine

Esimeses näites näitasime teile järgmist a-vormingu põhivormingut sed asendamine:

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

The s jutustab sed see on asendus. Esimene string on otsingumuster ja teine ​​on tekst, millega soovime selle sobitatud teksti asendada. Muidugi, nagu kõigi muude Linuxi puhul, on ka kurat detailides.

Kõigi „päeva“ esinemiste muutmiseks „nädalaks“ sisestame järgmise ja anname meresõitjale ja albatrossile rohkem aega sidumiseks:

sed-n 's / päev / nädal / p' coleridge.txt

Esimeses reas muudetakse ainult teist päeva esinemist. See on sellepärast, et sed peatub pärast esimest matši rea kohta. Üldise otsingu tegemiseks peame avaldise lõppu lisama "g", nagu allpool näidatud, nii et iga rea ​​kõik vasted töödeldakse:

sed-n 's / päev / nädal / gp' coleridge.txt

See sobib esimese rea neljast kolmest. Sest esimene sõna on “Päev” ja sed on tõstutundlik, ei pea ta seda eksemplari samaks päevaga.

Sisestame järgmise, lisades i avaldise lõpus olevale käsule juhtumite tundetuks muutmiseks:

sed-n 's / päev / nädal / gip' coleridge.txt

See töötab, kuid te ei pruugi alati soovida kõigi jaoks sisse lülitada juhtumite tundetust. Sellistel juhtudel saate mustrispetsiifilise juhtumitundetuse lisamiseks kasutada regex-rühma.

Näiteks kui sisestame märgid nurksulgudesse ([]) tõlgendatakse neid kui „mis tahes märke sellest tähemärkide loendist”.

Sisestame järgmised ja kaasame rühma tähed „D” ja „d”, tagamaks, et need vastavad nii päevale kui ka päevale:

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

Samuti võime piirata asendusi faili osadega. Oletame, et meie fail sisaldab esimeses värsis imelikke tühikuid. Esimese salmi nägemiseks võime kasutada järgmist tuttavat käsku:

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

Otsime kahte tühikut ja asendame need ühega. Teeme seda ülemaailmselt, nii et toimingut korratakse kogu rea ulatuses. Selguse huvides on otsingumuster tühik, tühikutäht (*) ja asendusstring on üks tühik. The 1,4 piirab asendamist faili nelja esimese reaga.

Me panime kõik kokku järgmises käsus:

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

See töötab kenasti! Siin on oluline otsingumuster. Tärn (*) tähistab nulli või rohkem eelnevat märki, mis on tühik. Seega otsib otsingumuster ühe või enama tühiku stringe.

Kui asendame ühe tühiku mitme tühiku järjestusega, tagastame faili tavapärasele vahele, kusjuures iga sõna vahel on üks tühik. See asendab mõnel juhul ka ühe tühiku ühe ruumiga, kuid see ei mõjuta midagi ebasoodsat - saame siiski soovitud tulemuse.

Kui sisestame järgmise ja vähendame otsingumustri ühele tühikule, näete kohe, miks peame lisama kaks tühikut:

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

Kuna tärn sobib nulli või enama eelneva tähemärgiga, näeb ta tähemärki, mis pole tühik, nullruumina ja rakendab sellele asendust.

Kui lisame otsingumustrisse kaks tühikut,sed peab enne asenduse leidmist leidma vähemalt ühe tühiku. See tagab, et tühimärgid jäävad puutumata.

Sisestame järgmise, kasutades -e (väljend), mida me kasutasime varem, mis võimaldab meil teha korraga kahte või enamat asendust:

sed -n -e 's / liikumine / laperdus / gip' -e 's / ookean / renn / gip' coleridge.txt

Sama tulemuse saame saavutada, kui kasutame semikoolonit (;) kahe avaldise eraldamiseks, näiteks:

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

Kui vahetasime järgmises käsus sõna „päev” nädala vastu, vahetati ka avaldise „päev hästi” päev eksemplaris:

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

Selle vältimiseks saame proovida asendusi ainult teistel mustritel vastavatel joontel. Kui muudame käsku nii, et alguses oleks otsingumuster, kaalume ainult selle mustriga sobivate joontega töötamist.

Sisestame järgmise teksti, et muuta meie sobiv muster sõnaks "pärast":

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

See annab meile soovitud vastuse.

Keerukamad asendused

Anname Coleridge'ile puhkuse ja kasutame sed nimede väljavõtmiseks etc / passwd faili.

Selleks on lühemaid viise (rohkem sellest hiljem), kuid me kasutame siin pikemat viisi teise kontseptsiooni demonstreerimiseks. Igat otsingumustri sobitatud üksust (nn alaväljendid) saab nummerdada (kuni üheksa üksust). Seejärel saate neid numbreid kasutada omased käsud viidata konkreetsetele alaväljenditele.

Alamavaldus tuleb lisada sulgudesse [()], et see töötaks. Sulgudele peab eelnema ka tahapoole kaldkriips (\), et vältida nende tavalise iseloomuna käsitlemist.

Selleks tippige järgmine:

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

Jaotame selle:

  • sed /: The sed käsk ja asendusavalduse algus.
  • \(: Ava sulg(], mis sisaldab alaväljendit, millele eelneb tagasilükk (\).
  • [^:]*: Otsingutermini esimene alaväljend sisaldab nurksulgudes rühma. Toon (^) tähendab rühmas kasutatuna mitte. Grupp tähendab mis tahes märki, mis pole koolon (:) aktsepteeritakse matšina.
  • \): Lõppsulg [)] eelneva tagasilöögiga (\).
  • .*: See teine ​​otsingu alaväljend tähendab "suvalist tähemärki ja suvalist arvu neist".
  • /\1: Avaldise asendusosa sisaldab 1 eelneb tagasilöögi (\). See tähistab teksti, mis vastab esimesele alaväljendile.
  • /': Lõpp-kaldkriips (/) ja üks tsitaat (') lõpetada sed käsk.

Mida see kõik tähendab, et otsime kõiki tähemärke, mis ei sisaldaks koolonit (:), mis on teksti sobitamise esimene eksemplar. Seejärel otsime sellel real midagi muud, mis on teksti sobitamise teine ​​eksemplar. Asendame kogu rea tekstiga, mis vastas esimesele alaväljendile.

Iga rida / etc / passwd fail algab kooloniga lõpetatud kasutajanimega. Sobitame kõik kuni esimese koolonini ja asendame selle väärtuse seejärel kogu reaga. Niisiis, oleme kasutajanimed eraldanud.

Järgmisena lisame sulgudesse teise alaväljenduse [()], et saaksime sellele viidata ka numbri järgi. Asendame ka \1 koos \2. Meie käsk asendab nüüd kogu rea kõigega alates esimesest koolonist (:) rea lõpuni.

Sisestame järgmise:

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

Need väikesed muudatused muudavad käsu tähenduse ümber ja saame kõik peale kasutajanimede.

Vaatame nüüd seda kiiret ja lihtsat viisi.

Meie otsingutermin pärineb esimesest koolonist (:) rea lõpuni. Kuna meie asendusavaldus on tühi (//), me ei asenda sobivat teksti millegagi.

Niisiis, kirjutame järgmise, tükeldades kõik esimesest koolonist (:) rea lõppu, jättes ainult kasutajanimed:

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

Vaatame näidet, kus viidame esimesele ja teisele vastele ühes ja samas käsus.

Meil on komadega fail (,) eraldades ees- ja perekonnanimed. Soovime need loetleda kui „perekonnanimi, eesnimi”. Me saame kasutadakass, nagu allpool näidatud, et näha, mis failis on:

kass geeks.txt

Nagu paljud sed käsud, võib see järgmine esmalt välja näha läbimatuks:

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

See on asenduskäsk nagu teised, mida oleme kasutanud, ja otsingumuster on üsna lihtne. Jaotame selle allpool:

  • sed /: Tavaline asenduskäsk.
  • ^: Kuna tald ei ole rühmas ([]), see tähendab "rea algust".
  • \(.*\),: Esimene alaväljend on suvaline arv suvalisi märke. See on suludesse suletud [()], millest igaühele eelneb kaldkriips (\), nii et saame sellele viidata numbri järgi. Kogu meie senine otsingumuster tõlgib otsingut rea algusest kuni esimese komani (,) suvalise arvu tähemärkide jaoks.
  • \(.*\): Järgmine alaväljend on (jälle) suvaline arv suvalisi märke. See on suletud ka sulgudesse [()], millele mõlemale eelneb kaldkriips (\), nii et saame sobiva teksti viidata arvu järgi.
  • $/: Dollari märk ($) tähistab rea lõppu ja võimaldab meie otsingut jätkata rea ​​lõpuni. Oleme seda kasutanud lihtsalt dollarimärgi tutvustamiseks. Meil pole seda siin tegelikult vaja, kuna tärn (*) läheks selle stsenaariumi korral rea lõppu. Kaldkriips (/) täidab otsingumustri jaotise.
  • \ 2, \ 1 / g ': Kuna sulgesime oma kaks alaväljendit sulgudesse, võime mõlemale viidata nende arvu järgi. Kuna me tahame järjekorra muuta, sisestame need järgmiselt teine ​​matš, esimene matš. Numbritele peab eelnema kaldkriips (\).
  • / g: See võimaldab meie käsul töötada globaalselt igal real.
  • geeks.txt: Fail, millega töötame.

Võite kasutada ka käsku Lõika (c), et asendada terved read, mis vastavad teie otsingumustrile. Sisestame järgmise, et otsida rida sõnaga "kael", ja asendada see uue tekstistringiga:

sed '/ kael / c ümber mu randme oli nööritud' coleridge.txt

Meie uus rida ilmub nüüd väljavõtte allservas.

Ridade ja teksti lisamine

Saame oma faili lisada ka uusi ridu ja teksti. Uute ridade lisamiseks sobivate ridade järgi kasutame käsku Lisa (a).

Siin on fail, millega hakkame töötama:

kass geeks.txt

Oleme selle ridade nummerdamise hõlbustamiseks nummerdanud.

Sõna "Ta" sisaldavate ridade otsimiseks sisestame järgmise ja sisestame nende alla uue rea:

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

Sisestame järgmise ja kaasame käsu Insert (i), et lisada uus rida nende ridade kohale, mis sisaldavad sobivat teksti:

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

Saame kasutada tähemärki (&), mis tähistab algset sobitatud teksti, et lisada sobiv tekst reale. \1 , \2ja nii edasi esindavad vastavaid alaväljendeid.

Rea algusesse teksti lisamiseks kasutame asenduskäsku, mis sobib kõigega reas, koos asendusklausliga, mis ühendab meie uue teksti algse reaga.

Selle kõige tegemiseks sisestame järgmise:

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

Sisestame järgmise, sealhulgas G käsk, mis lisab iga rea ​​vahele tühja rea:

sed 'G' geeks.txt

Kui soovite lisada vähemalt kaks tühja rida, võite seda kasutada G; GG; G; G, ja nii edasi.

Liinide kustutamine

Käsk Kustuta (d) kustutab read, mis vastavad otsingumustrile, või need, mis on määratud rea numbrite või vahemikega.

Näiteks kolmanda rea ​​kustutamiseks sisestame järgmise:

sed '3d' geeks.txt

Nelja kuni viie rea vahemiku kustutamiseks sisestame järgmise:

sed '4,5d' geeks.txt

Vahemikust väljaspool olevate joonte kustutamiseks kasutame hüüumärki (!), nagu allpool näidatud:

sed '6,7! d' geeks.txt

Muudatuste salvestamine

Siiani on kõik meie tulemused terminaliaknasse trükitud, kuid me pole neid veel kuhugi salvestanud. Nende püsivaks muutmiseks võite oma muudatused kirjutada algsesse faili või suunata need uuele.

Algse faili ülekirjutamine nõuab teatud ettevaatlikkust. Kui sinu sed käsk on vale, võite algses failis teha mõningaid muudatusi, mida on raske tagasi võtta.

Mõneks meelerahuks sed saab enne käsu täitmist luua originaalfaili varukoopia.

Võite kasutada valikut Kohapeal (-i) ütlemased originaalfaili muudatuste kirjutamiseks, kuid kui lisate sellele faililaiendi, sed varundab algse faili uude. Sellel on sama nimi kui algsel failil, kuid uue faililaiendiga.

Demonstreerimiseks otsime kõik read, mis sisaldavad sõna "Ta", ja kustutame need. Varundame ka oma algse faili uude, kasutades BAK-i laiendust.

Selle kõige tegemiseks sisestame järgmise:

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

Tippime järgmise, et veenduda, et meie varundusfaili ei muudeta:

kass geeks.txt.bak

Väljundi ümbersuunamiseks uude faili ja sarnase tulemuse saavutamiseks võime tippida ka järgmise:

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

Me kasutame kass kinnitamaks muudatuste kirjutamist uude faili, nagu allpool näidatud:

kass new_geeks.txt

Olles seda kõike vaimustanud

Nagu olete ilmselt märganud, isegi see kiire praimer peal sed on üsna pikk. Selles käsus on palju ja sellega saate teha veelgi rohkem.

Loodetavasti on need põhimõisted siiski andnud tugeva aluse, millele saate edasi õppida, kui jätkate lisateavet.