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" sed
ja 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 /
: Thesed
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 sisaldab1
eelneb tagasilöögi (\
). See tähistab teksti, mis vastab esimesele alaväljendile./'
: Lõpp-kaldkriips (/
) ja üks tsitaat ('
) lõpetadased
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ärgmiseltteine 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
, \2
ja 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; G
, G; 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.