Dina Diri Kuring artikel saméméhna Kuring parantos ngawartosan anjeun dina tingkat dasar kumaha masing-masing karakter khusus ungkapan anu biasa dianggo. Kalayan éksprési biasa ieu dimungkinkeun pikeun milarian rumit dina file téks atanapi dina kaluaran paréntah sanés. Dina tulisan ieu kuring badé ngajelaskeun kumaha ngagunakeun paréntah sed pikeun milarian sareng ngagentos téks ku cara anu langkung kuat tibatan ngan saukur ngarobah hiji téks pikeun téks anu sanés.
daptar eusi
Sakedik langkung seueur ngeunaan paréntah grep
Sateuacan kuring ngamimitian nyarioskeun séd, kuring hoyong mairan sakedik langkung seueur ngeunaan paréntah grep kanggo ngalengkepan naon anu dipedar dina tulisan samemehna sakedik. Sadayana anu kuring badé nyarios ogé bakal aya hubunganana sareng anu ieu. Engké urang bakal ningali hubungan antara ieu sareng pamilarian.
Ngagabungkeun éksprési biasa
Seueur karakter khusus anu parantos kuring carioskeun dina artikel saencanna tiasa digabungkeun, sanés ngan ukur karakter sanésna, tapi kalayan éksprési biasa. Cara pikeun ngalakukeun ieu nyaéta ngagunakeun kurung pikeun ngawangun subéksprési. Hayu urang tingali conto ieu. Hayu urang mimitian ku ngaunduh téks anu tiasa urang anggo pikeun uji. Éta mangrupikeun daptar frasa. Pikeun éta kami bakal nganggo paréntah ieu:
curl http://artigoo.com/lista-de-frases-comparativas-comicas 2>/dev/null | sed -n 's/.*\(.*\.\)<\/p>/\1/gp' > frases
Ieu bakal ngantepkeun anjeun dina diréktori dimana anjeun ngaluncurkeun file anu namina «frasa». Anjeun tiasa mukakeunana pikeun ningali sareng seuri sakedik. 🙂
Ayeuna hayu urang anggap yén urang hoyong mendakan frasa anu persis 6 kecap. Kasusahna nyaéta ngawangun ungkapan biasa anu cocog sareng unggal kecap. Kecap mangrupikeun sekuen hurup, boh ageung atanapi aksara leutik, anu bakal sapertos kitu '[a-zA-Z]+'
, tapi anjeun ogé kedah nangtoskeun yén hurup-hurup ieu kedah dipisahkeun ku karakter sanés tibatan hurup, nyaéta, bakal siga kitu '[a-zA-Z]+[^a-zA-Z]+'
. Émut: "^" salaku karakter munggaran di jero kurung nunjukkeun yén urang hoyong cocog sareng karakter anu teu aya dina rentang sareng "+" nunjukkeun 1 atanapi langkung karakter.
Kami parantos ngagaduhan ungkapan biasa anu tiasa cocog sareng hiji kecap. Masangkeunana sareng 6, éta kedah diulang 6 kali. Pikeun éta kami nganggo koncina, tapi gunana pikeun nempatkeun '[a-zA-Z]+[^a-zA-Z]+{6}'
, sabab anu 6 bakal ngulang bagian pamungkas tina ungkapan biasa sareng anu urang hoyongkeun nyaéta ngulang deui sadayana, janten anu anjeun kedah nempatkeun nyaéta: '([a-zA-Z]+[^a-zA-Z]+){6}'
. Kalayan kurung urang ngawangun subéksprési sareng nganggo kurung kami ngulang deui 6 kali. Ayeuna anjeun kedah nambihan "^" di payun sareng "$" di tukang pikeun cocog sareng sadaya garis. Paréntahna sapertos kieu:
grep -E '^([a-zA-Z]+[^a-zA-Z]+){6}$' frases
Sareng hasilna ngan ukur anu kami hoyongkeun:
Éta langkung dinyanyikeun dibanding Macarena. Anjeun langkung réngsé tibatan Luis Aguilé. Anjeun gaduh budaya kirang tibatan batu. Anjeun terang langkung seueur basa tibatan Cañita Brava. Anjeunna ngagaduhan langkung kisut tibatan Tutan Khamón. Anjeun terang kirang ti Rambo ngeunaan ngurus budak.
Perhatikeun yén kami nempatkeun parameter -E kusabab kami hoyong nganggo ungkapan biasa anu diperpanjang supaya "+" tiasa dianggo. Upami urang nganggo anu dasarna, urang kedah kabur kurung sareng kurung.
Rujukan deui atanapi référénsi
Upami anjeun ngagaduhan pamariksaan éja, anjeun panginten bakal ngagaduhan daptar kecap dina /usr/share/dict/words
. Upami henteu, anjeun tiasa masangkeunana dina lengkungan kalayan:
sudo pacman -S words
Atanapi dina debian sareng:
sudo aptitude install dictionaries-common
Upami anjeun hoyong anjeun tiasa ningali file ieu pikeun ningali naon kecap na. Sabenerna éta mangrupikeun tautan kana kecap file tina bahasa anu distro anjeun. Anjeun tiasa gaduh sababaraha file kecap dipasang dina waktos anu sami.
Kami badé nganggo file éta. Tétéla kami panasaran pisan terang sadayana tujuh palindrom hurup di ditu. Pikeun anu henteu terang: Palindrome mangrupikeun kecap capicúa, nyaéta, tiasa dibaca ti kénca ka katuhu ogé ti katuhu ka kénca. Hayu urang cobian paréntah ieu:
grep '^\(.\)\(.\)\(.\).\3\2\1$' /usr/share/dict/words
Sigana rada ahéng, leres? Upami urang nyobian, hasilna bakal gumantung kana basa distro anjeun sareng kecap-kecap anu aya dina daptar anjeun, tapi dina kasus kuring, ku basa Spanyol, hasilna na nyaéta:
aniline aniline ngagugulung
Hayu urang tingali kumaha éksprési biasa ieu.
Salain ti "^" sareng "$", anu parantos kami terang pikeun naon, hal anu pangpayunna urang tingali di kénca nyaéta tilu kelompok titik anu dikurung dina kurung. Entong lieur ku batang di hareupeun unggal kurung. Éta kabur tina kurung sabab kami nganggo ungkapan biasa dasar, tapi éta henteu ngagaduhan hartos anu sanés. Anu penting nyaéta kami nyuhungkeun tilu karakter anu aya dina titik-titik éta, tapi masing-masing titik éta dibungkus dina kurung. Ieu pikeun ngahemat karakter anu cocog sareng poin éta supados tiasa dirujuk deui tina ungkapan biasa. Ieu mangrupikeun kagunaan kurung anu sanés tiasa dianggo engké pikeun ngagentoskeun.
Ieu dimana tilu nomer di handap sumping sareng garis miring di payuneun aranjeunna. Dina hal ieu, palang penting. Hal ieu digunakeun pikeun nunjukkeun yén angka di handap mangrupikeun réferénsi sareng ngarujuk kana salah sahiji kurung sateuacanna. Salaku conto: \ 1 ngarujuk kana kurung munggaran, \ 2 ka kadua, sareng sajabana.
Kalayan kecap séjén, ku éksprési biasa anu urang atos nempatkeun, anu urang pilari nyaéta sadayana kecap anu dimimitian ku opat hurup teras ngagaduhan hurup anu sami sareng anu katilu, anu sanésna sami sareng anu kadua sareng lain anu sarua jeung anu tiheula. Hasilna nyaéta palindrom tujuh hurup anu aya dina daptar kecap. Sakumaha anu dipikahoyong.
Upami urang nganggo ungkapan biasa anu diperpanjang, kurung henteu kedah kabur, tapi ku éksprési biasa anu diperpanjang, réferénsi henteu jalan dina sadaya program sabab éta henteu distandarkeun. Nanging, ku grep aranjeunna damel, janten panginten tiasa janten cara anu sanés pikeun sami. Anjeun tiasa nyobian upami anjeun hoyong.
Babasan ngagantian: paréntah séd
Salian ti milarian, salah sahiji panggunaan ungkapan biasa anu pangsaéna nyaéta ngagentos téks kompléks. Pikeun ngalakukeun ieu, salah sahiji cara pikeun ngalakukeun éta nyaéta paréntah sed. Kakuatan paréntah sed jauh ngalangkungan ngaganti téks, tapi di dieu kuring bakal ngagunakeunana pikeun éta. Sintaksis anu bakal kuring anggo ku paréntah ieu nyaéta kieu:
sed [-r] 's/REGEX/REPL/g' FICHERO
Atanapi ogé:
COMANDO | sed [-r] 's/REGEX/REPL/g'
Dimana REGEX bakal janten ungkapan biasa milarian sareng REPL bakal ngagentos. Émut yén paréntah ieu henteu leres-leres ngagentoskeun naon-naon dina file anu urang nunjukkeun, tapi naon anu dilakukeun nyaéta nunjukkeun urang hasil ngagantian dina terminal, janten ulah sieun ku paréntah anu kuring badé teraskeun. Teu aya diantara aranjeunna anu bakal ngarobih file naon waé dina sistem anjeun.
Hayu urang mimitian ku conto saderhana. Urang sadayana ngagaduhan sababaraha file konfigurasi dina diréktori / jsb anu biasana ngagaduhan koméntar dimimitian ku "#". Anggap kami hoyong ningali salah sahiji file ieu tanpa koméntar. Salaku conto, kuring badé ngalakukeun éta sareng fstab. Anjeun tiasa nyobian anu anjeun pikahoyong.
sed 's/#.*//g' /etc/fstab
Kuring moal nempatkeun hasil paréntah di dieu sabab éta gumantung kana naon anu anjeun gaduh dina fstab anjeun, tapi upami anjeun ngabandingkeun kaluaran paréntah sareng eusi file anjeun bakal ningali yén sadaya koméntar parantos ngaleungit.
Dina paréntah ieu ungkapan milarian nyaéta «#.*
", Éta mangrupikeun" # "dituturkeun ku sababaraha karakter, nyaéta koméntarna. Sareng ungkapan ngagentos, upami anjeun ningali dua batang dina urutan, anjeun bakal ningali yén teu aya, janten naon anu dilakukeun nyaéta ngagentos koméntar ku nanaon, nyaéta mupusana. Saderhana teu mungkin.
Ayeuna urang bakal ngalakukeun anu sabalikna. Upamana waé anu urang pikahoyong nyaéta mairan sadaya baris file. Hayu urang cobian sapertos kieu:
sed 's/^/# /g' /etc/fstab
Anjeun bakal ningali éta, dina kaluaran paréntah, sadaya garis dimimitian ku tanda Hash sareng rohangan kosong. Anu parantos kami laksanakeun nyaéta ngaganti awal garis ku «#
«. Ieu ogé conto anu cukup saderhana dimana téks anu bakal diganti sok sami, tapi ayeuna urang bakal ngahesekeunana sakedik deui.
Rahmat ngagantian nyaéta yén dina éksprési ngagantian anjeun tiasa nganggo référénsi sapertos anu tos kuring bébéja ka anjeun sateuacana. Hayu urang balikan deui kana file frasa anu urang unduh dina awal tulisan. Kami badé nempatkeun kana kurung sadaya huruf kapital anu aya, tapi kami bakal ngalaksanakeunana ku paréntah:
sed 's/\([A-Z]\)/(\1)/g' frases
Naon anu urang ngagaduhan di dieu nyaéta réferénsi dina ungkapan ngagantian anu ngarujuk kana kurung dina ungkapan pamilarian. Kurung dina éksprési ngagantian nyaéta kurung normal. Dina éksprési ngagantian aranjeunna henteu ngagaduhan hartos khusus, aranjeunna nempatkeun sakumaha anu kasebut. Hasilna nyaéta sadaya huruf kapital diganti ku hurup anu sami, naon waé, sareng tanda kurung di sakurilingna.
Aya karakter sanés anu ogé tiasa dianggo dina ungkapan ngagantian, nyaéta "&" sareng digentoskeun ku sadaya téks anu cocog sareng ungkapan pamilarian. Conto ieu tiasa nempatkeun sadayana frasa dina file dina tanda petik. Ieu tiasa dihontal ku paréntah ieu:
sed 's/.*/"&"/g' frases
Operasi paréntah ieu mirip pisan sareng anu sateuacana, ngan ayeuna anu urang ngaganti nyaéta sakabéh garis ku garis anu sami sareng tanda kutip di sakurilingna. Kusabab urang nganggo "&", teu kedah nempatkeun kurung.
Sababaraha paréntah anu gunana ku ungkapan biasa
Ieu sababaraha paréntah anu kuring anggap mangpaat atanapi panasaran sareng anu nganggo ungkapan biasa. Kalayan paréntah ieu gunana ungkapan biasa langkung saé tibatan conto anu kuring kantos masihan dugi ka ayeuna, tapi sigana penting pikeun kuring pikeun ngajelaskeun hal ngeunaan kumaha ungkapan biasa pikeun paham pikeun paham éta.
- Tembongkeun bagian halaman lalaki:
man bash | grep '^[A-Z][A-Z ]*$'
Tangtosna, anjeun tiasa ngarobih paréntah bash kana naon waé anu anjeun pikahoyong. Teras ti manusa, anjeun tiasa langsung kana bagian anu dipikaresep ku anjeun, tangtosna, ungkapan biasa. Pencét «/» pikeun ngamimitian milarian sareng nyerat «^ALIASES$
»Pikeun buka bagian ALIASES, contona. Jigana ieu mangrupikeun panggunaan munggaran anu kuring mimiti ngadamel éksprési biasa sababaraha taun ka pengker. Ngalangkungan sababaraha halaman manual ampir teu mungkin tanpa trik sapertos kieu.
- Tembongkeun nami sadaya pangguna mesin kalebet anu khusus:
sed 's/\([^:]*\).*/\1/' /etc/passwd
- Tembongkeun nami pangguna, tapi ngan ukur anu nganggo cangkang:
grep -vE '(/false|/nologin)$' /etc/passwd | sed 's/\([^:]*\).*/\1/g'
Éta tiasa leres-leres dilakukeun ku éksprési biasa, tapi cara ngalaksanakeunana ngalangkungan naon anu kuring béjakeun ka anjeun dina artikel ieu, janten kuring parantos ngalaksanakeunana ku ngagabungkeun dua paréntah.
- Lebetkeun koma sateuacan tilu digit terakhir tina sadaya nomer dina file angka:
sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' numbers
Éta ngan ukur tiasa dianggo sareng nomer dugi ka 6 angka, tapi éta tiasa disebat langkung ti sakali pikeun nempatkeun pemisah dina grup anu sanés tilu digit.
- Ékstrak sadaya alamat email tina file:
grep -E '\<[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\>' FICHERO
- Pisahkeun dinten, bulan sareng taun sadaya tanggal anu nembongan dina file:
sed -r 's/([0-9]{2})[/-]([0-9]{2})[/-]([0-9]{4})/Día: \1, Mes: \2, Año: \3/g' FICHERO
- Milarian IP lokal kami:
/sbin/ifconfig | grep 'inet .*broadcast' | sed -r 's/[^0-9]*(([0-9]+\.){3}[0-9]+).*/\1/g'
Ieu ogé tiasa dilakukeun ku paréntah sed tunggal, tapi kuring langkung saé misah kana grep sareng sed pikeun kesederhanaan.
Sababaraha alamat anu manpaat
Ieu sababaraha alamat anu tiasa janten mangpaat anu aya hubunganana sareng ungkapan biasa:
- Perpustakaan éksprési biasa: Éta perpustakaan éksprési biasa dimana anjeun tiasa milari ungkapan biasa anu aya hubunganana sareng topik anu anjeun pikaresep. Pikeun milarian alamat wéb, KTP atanapi naon waé.
- RegExr: Pamariksaan ekspresi rutin online. Éta ngamungkinkeun anjeun ngalebetkeun téks sareng nerapkeun ungkapan biasa pikeun éta milarian atanapi ngagentos. Éta masihan inpormasi ngeunaan ungkapan biasa sareng anjeun gaduh sababaraha pilihan pikeun ngarobih paripolahna.
- Tés Éksprési Biasa: Éta mangrupikeun addon pikeun firefox anu ngamungkinkeun mariksa éksprési biasa tina panyungsi.
kacindekan
Kanggo ayeuna éta waé. Éksprési rutin rumit tapi mangpaat. Butuh waktos pikeun diajar aranjeunna, tapi upami anjeun sapertos kuring, maén sareng aranjeunna bakal katingali pikaresepeun sareng, saeutik demi saeutik anjeun bakal ngawasa aranjeunna. Mangrupikeun sadunya. Masih seueur anu nyarioskeun ngeunaan kuantifér anu teu puguh, gaya PERL regex, multiline, jsb Teras masing-masing program ngagaduhan ciri sareng varian na, janten naséhat anu pangsaéna anu tiasa kuring pasihan nyaéta sok ningali dokuméntasi program anu anjeun anggo unggal-unggal anjeun kedah nyerat ungkapan biasa dina program anu énggal.
Héy! … HEY! … GUGAH! … Naon anu anjeun sadayana bobo? 🙂
Sumber cai
Sababaraha ideu sareng conto pikeun ungkapan biasa dina tulisan ieu anu kuring candak ti dieu:
- http://sed.sourceforge.net/sed1line.txt
- http://www.thegeekstuff.com/2009/10/unix-sed-tutorial-advanced-sed-substitution-examples/
15 koméntar, tinggalkeun anjeun
Masterly !!!
Éta henteu saé pisan, tapi hatur nuhun pisan. Mudah-mudahan jalma resep. 🙂
Abdi resep ha!
Maka kuring kedah ngalakukeun anu leres. NGABARAKATAK!! 🙂
Hatur nuhun pisan kana komentarna.
Bangsat terus nulis lalaki, jaga.
@Blaire Pascal: Koméntar sapertos anjeun ngadorong éta. 🙂 Hatur nuhun pisan !!
Abdi ogé resep ... hatur nuhun 🙂
Hatur nuhun kana koméntar. Kuring miharep pikeun nulis sababaraha deui. 🙂
Pos anjeun hebat, anjeun diajar seueur, tibatan, anjeun diajar ngalaksanakeun tugas ku cara anu elegan sareng éfisién.
Dupi anjeun panginten ngeunaan ngumpulkeun sadaya tulisan skrip batok anjeun? Diurutkeun dina pdf bakal ngajantenkeun manual anu saé.
Gening sareng hatur nuhun pisan!
Hatur nuhun pisan!! Éta sanés ideu anu goréng. Dina waktos ayeuna ngan aya dua, tapi kuring bakal mikirkeun engké. 🙂
tulisan anu saé pisan, 5+.
Hatur nuhun. Abdi bungah anjeun resep éta. 🙂
Alus teuing! Kuring kedah ngarobih ungkapan ieu sareng kuring henteu terang kumaha ngalakukeunana:
192.168.0.138/Server ku 192.168.0.111/data
Masalahna aya dina simbol "/".
Kuring ngagunakeun paréntah:
manggih. -nami "* .txt" -exec sed -i 's / TEXT1 / TEXT2 / g' {} \;
Naon anu dianggo pikeun ngalaksanakeun jinis ieu tugas ku remissively, tapi kuring henteu tiasa ...
Naha aya anu terang kumaha kuring kedah ngalaksanakeunana?
Peluk!
séba
Naon anu anjeun kedah lakukeun nyaéta kabur karakter sapertos kieu:
manggih. -nami "* .txt" -exec sed -i 's / \ / Server / \ / data / g' {} \;
Anjeun tiasa ogé ngagunakeun SEPARATOR sanés dina séd. Éta henteu kedah janten palang. Sed ngamungkinkeun karakter naon waé anu tiasa dianggo. Salaku conto, ieu bakal langkung jelas:
manggih. -nami "* .txt" -exec sed -i 's | / Server | / data | g' {} \;
Sareng upami anjeun badé nyalin sareng nempelkeun paréntah tina koméntar ieu, ati-ati ku tanda petik, yén wordpress ngarobihna pikeun anu tipografik. 🙂
Salam.
Alus pisan !!!!
Abdi parantos lami milari solusi ieu.
Di dieu kuring ninggalkeun paréntah lengkep anu kuring parantos anggo
manggih. -nami "* .txt" -exec sed -i 's | 192 \ .168 \ .0 \ .238 \ / Server | 192 \ .168 \ .0 \ .111 \ / data | g' {} \;
Kauntungannana paréntah ieu nyaéta ngarobih sadaya file .txt (atanapi ekstensi anu anjeun pikahoyong) sacara rekursif ... Anjeun kedah ati-ati pisan!
Tapi éta mangpaat pisan !!!
Nya, hatur nuhun kanggo sadayana sareng sarébu ucapan salamet pikeun sakumna grup.
Kuring sok maca éta tina surat!
Pelukan
séba