Paano Magamit ang sed Command sa Linux

Maaari itong mabaliw, ngunit ang Linux sed Ang utos ay isang text editor nang walang interface. Maaari mo itong magamit mula sa linya ng utos upang manipulahin ang teksto sa mga file at stream. Ipapakita namin sa iyo kung paano gamitin ang lakas nito.

Ang Lakas ng sed

Ang sed Ang utos ay katulad ng chess: tumatagal ng isang oras upang malaman ang mga pangunahing kaalaman at panghabambuhay upang mapangasiwaan sila (o, kahit na maraming pagsasanay). Ipapakita namin sa iyo ang isang pagpipilian ng mga pambungad na pagsusugal sa bawat isa sa mga pangunahing kategorya ng sed pagpapaandar.

sed ay isang stream editor na gumagana sa piped input o mga file ng teksto. Wala itong interactive na interface ng text editor. Sa halip, nagbibigay ka ng mga tagubilin para sundin ito habang gumagana ito sa pamamagitan ng teksto. Ang lahat ng ito ay gumagana sa Bash at iba pang mga shell ng command-line.

Kasama si sed magagawa mo ang lahat ng sumusunod:

  • Pumili ng teksto
  • Papalit na teksto
  • Magdagdag ng mga linya sa teksto
  • Tanggalin ang mga linya sa teksto
  • Baguhin (o panatilihin) ang isang orihinal na file

Isinaayos namin ang aming mga halimbawa upang ipakilala at maipakita ang mga konsepto, hindi upang makagawa ng pinakamaliit (at pinakamaliit lapitan) sed utos. Gayunpaman, ang pattern ng pagtutugma at pag-andar ng pagpili ng teksto ng sed lubos na umaasa sa mga regular na expression (regexes). Kakailanganin mo ng pamilyar sa mga ito upang masulit ang sed.

KAUGNAYAN:Paano Gumamit ng Mga Regular na Pagpapahayag (regexes) sa Linux

Isang Simpleng Halimbawa

Una, gagamitin namin echo upang magpadala ng ilang teksto sa sed sa pamamagitan ng isang tubo, at mayroon sed kapalit ng isang bahagi ng teksto. Upang magawa ito, nai-type namin ang sumusunod:

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

Ang echo nagpapadala ang utos ng "howtogonk" sa sed, at ang aming simpleng panuntunan sa pagpapalit (ang "mga" nangangahulugang kapalit) ay inilalapat.sed naghahanap ng input text para sa isang paglitaw ng unang string, at papalitan ang anumang mga tugma sa pangalawa.

Ang string na "gonk" ay pinalitan ng "geek," at ang bagong string ay nakalimbag sa window ng terminal.

Ang mga pamalit ay marahil ang pinaka-karaniwang paggamit ng sed. Gayunpaman, bago pa tayo makisawsaw nang mas malalim sa mga kahalili, kailangan nating malaman kung paano pumili at tumugma sa teksto.

Pagpili ng Teksto

Kakailanganin namin ng isang file ng teksto para sa aming mga halimbawa. Gagamitin namin ang isa na naglalaman ng isang seleksyon ng mga talata mula sa mahabang tula ni Samuel Taylor Coleridge na "The Rime of the ancient Mariner."

Na-type namin ang sumusunod upang tingnan ito mas kaunti:

mas mababa ang coleridge.txt

Upang pumili ng ilang mga linya mula sa file, nagbibigay kami ng mga linya ng pagsisimula at pagtatapos ng saklaw na nais naming piliin. Pinipili ng isang solong numero ang isang linya.

Upang kumuha ng mga linya isa hanggang apat, nai-type namin ang utos na ito:

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

Tandaan ang kuwit sa pagitan 1 at 4. Ang p nangangahulugang "naka-print na mga katugmang linya." Bilang default,sed naka-print ang lahat ng mga linya. Makikita namin ang lahat ng teksto sa file na may mga katugmang linya na naka-print nang dalawang beses. Upang maiwasan ito, gagamitin namin ang -n (Tahimik) na pagpipilian upang sugpuin ang hindi tugma na teksto.

Binabago namin ang mga numero ng linya upang makapili kami ng ibang berso, tulad ng ipinakita sa ibaba:

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

Maaari nating gamitin ang -e (expression) na pagpipilian upang makagawa ng maraming mga pagpipilian. Sa pamamagitan ng dalawang expression, maaari tayong pumili ng dalawang talata, tulad nito:

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

Kung bawasan natin ang unang numero sa pangalawang pagpapahayag, maaari nating ipasok ang isang blangko sa pagitan ng dalawang talata. Na-type namin ang sumusunod:

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

Maaari rin kaming pumili ng isang panimulang linya at sabihin sed upang hakbangin ang file at mag-print ng mga kahaliling linya, bawat ikalimang linya, o upang laktawan ang anumang bilang ng mga linya. Ang utos ay katulad ng ginamit namin sa itaas upang pumili ng isang saklaw. Gayunpaman, sa oras na ito, gagamitin namin ang isang tilde (~) sa halip na isang kuwit upang paghiwalayin ang mga numero.

Ipinapahiwatig ng unang numero ang panimulang linya. Ang ikalawang numero ang nagsasabi sed aling mga linya pagkatapos ng panimulang linya na nais naming makita. Ang bilang 2 ay nangangahulugang bawat pangalawang linya, 3 ay nangangahulugang bawat pangatlong linya, at iba pa.

Na-type namin ang sumusunod:

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

Hindi mo palaging malalaman kung saan matatagpuan ang file na iyong hinahanap sa file, na nangangahulugang ang mga numero ng linya ay hindi palaging magiging malaking tulong. Gayunpaman, maaari mo ring gamitin sed upang pumili ng mga linya na naglalaman ng pagtutugma ng mga pattern ng teksto. Halimbawa, kunin natin ang lahat ng mga linya na nagsisimula sa "At."

Ang caret (^) ay kumakatawan sa pagsisimula ng linya. Isasama namin ang aming termino para sa paghahanap sa mga slash na pasulong (/). Nagsasama rin kami ng puwang pagkatapos ng "At" kaya ang mga salitang tulad ng "Android" ay hindi isasama sa resulta.

Pagbabasa sed ang mga script ay maaaring medyo matigas sa una. Ang / p nangangahulugang "i-print," tulad ng ginawa nito sa mga utos na ginamit namin sa itaas. Gayunpaman, sa sumusunod na utos, isang forward slash ang mauuna:

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

Tatlong linya na nagsisimula sa "At" ay nakuha mula sa file at ipinapakita para sa amin.

Gumagawa ng Mga Kapalit

Sa aming unang halimbawa, ipinakita namin sa iyo ang sumusunod na pangunahing format para sa a sed pagpapalit:

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

Ang s nagsasabi sed ito ay isang pamalit. Ang unang string ay ang pattern ng paghahanap, at ang pangalawa ay ang teksto kung saan nais naming palitan ang katugmang teksto. Siyempre, tulad ng lahat ng mga bagay sa Linux, ang demonyo ay nasa mga detalye.

Na-type namin ang sumusunod upang mabago ang lahat ng mga paglitaw ng "araw" sa "linggo," at bigyan ang marinero at albatross ng mas maraming oras upang mag-bonding:

sed -n / araw / linggo / p 'coleridge.txt

Sa unang linya, ang pangalawang paglitaw lamang ng "araw" ang nabago. Ito ay dahil ang sed humihinto pagkatapos ng unang tugma bawat linya. Kailangan naming magdagdag ng isang "g" sa dulo ng ekspresyon, tulad ng ipinakita sa ibaba, upang maisagawa ang isang pandaigdigang paghahanap kaya ang lahat ng mga tugma sa bawat linya ay naproseso:

sed -n / araw / linggo / gp 'coleridge.txt

Tumutugma ito sa tatlo sa apat sa unang linya. Sapagkat ang unang salita ay "Araw," at sed case-sensitive, hindi isinasaalang-alang ang halimbawa na iyon ay kapareho ng "araw."

Na-type namin ang sumusunod, nagdaragdag ng isang ako sa utos sa dulo ng ekspresyon upang ipahiwatig ang case-insensitivity:

sed -n / araw / linggo / gip 'coleridge.txt

Gumagana ito, ngunit maaaring hindi mo laging nais na buksan ang case-insensitivity para sa lahat. Sa mga pagkakataong iyon, maaari kang gumamit ng isang regex na pangkat upang magdagdag ng pattern na tukoy sa case-insensitivity.

Halimbawa, kung isinasara namin ang mga character sa square bracket ([]), binibigyang kahulugan sila bilang "anumang character mula sa lista ng mga character na ito."

Na-type namin ang sumusunod, at isinasama ang "D" at "d" sa pangkat, upang matiyak na tumutugma ito sa parehong "Araw" at "araw":

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

Maaari rin nating paghigpitan ang mga pamalit sa mga seksyon ng file. Sabihin nating ang aming file ay naglalaman ng kakaibang spacing sa unang talata. Maaari naming gamitin ang sumusunod na pamilyar na utos upang makita ang unang talata:

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

Hahanapin namin ang dalawang puwang at palitan ang mga ito ng isa. Gagawin natin ito sa buong mundo kaya ang pagkilos ay paulit-ulit sa buong linya. Upang maging malinaw, ang pattern ng paghahanap ay puwang, puwang asterisk (*), at ang string ng pagpapalit ay isang solong puwang. Ang 1,4 nililimitahan ang kahalili sa unang apat na linya ng file.

Pinagsama namin ang lahat ng iyon sa sumusunod na utos:

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

Ito ay gumagana nang maayos! Ang pattern ng paghahanap ay kung ano ang mahalaga dito. Ang asterisk (*) ay kumakatawan sa zero o higit pa sa naunang karakter, na isang puwang. Kaya, ang pattern ng paghahanap ay naghahanap ng mga string ng isang puwang o higit pa.

Kung papalitan namin ang isang solong puwang para sa anumang pagkakasunud-sunod ng maraming mga puwang, ibabalik namin ang file sa regular na spacing, na may isang solong puwang sa pagitan ng bawat salita. Papalitan din nito ang isang solong puwang para sa isang solong puwang sa ilang mga kaso, ngunit hindi ito makakaapekto sa anumang masamang epekto - makukuha pa rin namin ang aming ninanais na resulta.

Kung nai-type namin ang sumusunod at binawasan ang pattern ng paghahanap sa isang solong espasyo, makikita mo agad kung bakit kailangan naming isama ang dalawang puwang:

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

Dahil tumutugma ang asterisk sa zero o higit pa sa naunang character, nakikita nito ang bawat character na hindi isang puwang bilang isang "zero space" at inilalapat ang pagpapalit dito.

Gayunpaman, kung isasama namin ang dalawang mga puwang sa pattern ng paghahanap,sed dapat maghanap ng kahit isang character na space bago ito mailapat ang kahalili. Tinitiyak nito na ang mga nonspace na character ay mananatiling hindi nagalaw.

Na-type namin ang sumusunod, gamit ang -e (expression) na ginamit namin nang mas maaga, na nagpapahintulot sa amin na gumawa ng dalawa o higit pang mga pagpapalit nang sabay-sabay:

sed -n -e / s / galaw / flutter / gip '-e' s / karagatan / kanal / gip 'coleridge.txt

Maaari nating makamit ang parehong resulta kung gumagamit kami ng isang titikting titik (;) upang paghiwalayin ang dalawang expression, tulad ng:

sed -n / galaw / flutter / gip; s / karagatan / kanal / gip 'coleridge.txt

Kapag nagpalitan kami ng "araw" para sa "linggo" sa sumusunod na utos, ang halimbawa ng "araw" sa ekspresyong "well a-day" ay napalitan din:

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

Upang maiwasan ito, maaari lang kaming magtangka ng mga pamalit sa mga linya na tumutugma sa isa pang pattern. Kung binago namin ang utos na magkaroon ng isang pattern ng paghahanap sa simula, isasaalang-alang lamang namin ang pagpapatakbo sa mga linya na tumutugma sa pattern na iyon.

Na-type namin ang sumusunod upang gawin ang aming pagtutugma na pattern ng salitang "pagkatapos":

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

Nagbibigay iyon sa atin ng nais na tugon.

Mas Masalimuot na Mga Pagpapalit

Bigyan natin ng pahinga at gamitin si Coleridge sed upang kumuha ng mga pangalan mula sa atbp / passwd file

Mayroong mas maiikling paraan upang magawa ito (higit pa sa paglaon), ngunit gagamitin namin ang mas mahabang paraan dito upang maipakita ang isa pang konsepto. Ang bawat naitugmang item sa isang pattern ng paghahanap (tinatawag na mga subexpression) ay maaaring mabilang (hanggang sa maximum na siyam na mga item). Maaari mo nang magamit ang mga numerong ito sa iyongsed mga utos na sumangguni sa mga tukoy na subexpression.

Kailangan mong i-enclose ang subexpression sa panaklong [()] upang ito ay gumana. Ang panaklong din ay dapat na mauna sa isang paatras na slash (\) upang maiwasang tratuhin sila bilang isang normal na karakter.

Upang magawa ito, mai-type mo ang sumusunod:

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

Tanggalin natin ito:

  • sed 's /: Ang sed utos at ang simula ng pagpapalit ng pagpapahayag.
  • \(: Ang panimulang panaklong [(] kalakip ang subexpression, na nauna sa pamamagitan ng isang backslash (\).
  • [^:]*: Ang unang subexpression ng termino para sa paghahanap ay naglalaman ng isang pangkat sa mga square bracket. Ang caret (^) nangangahulugang "hindi" kapag ginamit sa isang pangkat. Ang isang pangkat ay nangangahulugang anumang character na hindi isang colon (:) ay tatanggapin bilang isang tugma.
  • \): Ang pagsasara ng panaklong [)] na may naunang backslash (\).
  • .*: Ang pangalawang subexpression ng paghahanap na ito ay nangangahulugang "anumang character at anumang bilang ng mga ito."
  • /\1: Naglalaman ang bahagi ng pagpapalit ng ekspresyon 1 naunahan ng isang backslash (\). Kinakatawan nito ang teksto na tumutugma sa unang subexpression.
  • /': Ang pagsasara ng forward-slash (/) at solong quote (') wakasan ang sed utos

Ang ibig sabihin ng lahat ng ito ay maghanap kami para sa anumang mga string ng mga character na hindi naglalaman ng isang colon (:), na kung saan ay magiging unang halimbawa ng pagtutugma ng teksto. Pagkatapos, naghahanap kami ng anupaman sa linya na iyon, na magiging pangalawang pagkakataon ng pagtutugma ng teksto. Papalitan namin ang buong linya ng teksto na tumutugma sa unang subexpression.

Ang bawat linya sa / atbp / passwd nagsisimula ang file sa isang tinapos na username ng colon. Itutugma namin ang lahat hanggang sa unang colon, at pagkatapos ay palitan ang halagang iyon para sa buong linya. Kaya, ihiwalay namin ang mga username.

Susunod, iko-enclose namin ang pangalawang subexpression sa mga panaklong [()] upang maaari natin itong sanggunian sa pamamagitan ng numero, pati na rin. Papalitan din namin \1 kasama si \2. Papalitan ngayon ng aming utos ang buong linya ng lahat mula sa unang colon (:) sa dulo ng linya.

Na-type namin ang sumusunod:

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

Ang mga maliliit na pagbabago na iyon ay binabaligtad ang kahulugan ng utos, at nakukuha natin ang lahat maliban sa mga username.

Ngayon, tingnan natin ang mabilis at madaling paraan upang magawa ito.

Ang aming termino para sa paghahanap ay mula sa unang colon (:) sa dulo ng linya. Dahil ang aming pagpapalit ng expression ay walang laman (//), hindi namin papalitan ang katugmang teksto ng anumang bagay.

Kaya, nai-type namin ang sumusunod, pinuputol ang lahat mula sa unang colon (:) sa dulo ng linya, naiwan lamang ang mga username:

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

Tingnan natin ang isang halimbawa kung saan tinutukoy namin ang una at pangalawang mga tugma sa parehong utos.

Mayroon kaming isang file ng mga kuwit (,) paghihiwalay ng una at huling pangalan. Nais namin silang ilista bilang "apelyido, unang pangalan." Pwede natin gamitinpusa, tulad ng ipinakita sa ibaba, upang makita kung ano ang nasa file:

pusa geeks.txt

Kagaya ng maraming sed utos, ang susunod na ito ay maaaring mukhang hindi mapasok sa una:

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

Ito ay isang utos ng kahalili tulad ng iba na ginamit namin, at ang pattern ng paghahanap ay medyo madali. Ihiwalay namin ito sa ibaba:

  • sed 's /: Ang normal na utos ng pagpapalit.
  • ^: Dahil ang caret ay wala sa isang pangkat ([]), nangangahulugang "Ang simula ng linya."
  • \(.*\),: Ang unang subexpression ay anumang bilang ng anumang mga character. Ito ay nakapaloob sa panaklong [()], ang bawat isa ay naunahan ng isang backslash (\) upang maaari natin itong sanggunian sa pamamagitan ng numero. Ang aming buong pattern sa paghahanap sa ngayon ay isinasalin bilang paghahanap mula sa simula ng linya hanggang sa unang kuwit (,) para sa anumang bilang ng anumang mga character.
  • \(.*\): Ang susunod na subexpression ay (muli) anumang bilang ng anumang character. Nakapaloob din ito sa panaklong [()], na kapwa pinasimulan ng isang backslash (\) upang maaari naming sanggunian ang katugmang teksto ayon sa bilang.
  • $/: Ang sign ng dolyar ($) ay kumakatawan sa dulo ng linya at papayagan ang aming paghahanap na magpatuloy sa dulo ng linya. Ginamit namin ito nang simple upang ipakilala ang dolyar na dolyar. Hindi namin talaga ito kailangan dito, bilang asterisk (*) ay pupunta sa dulo ng linya sa senaryong ito. Ang forward slash (/) Nakumpleto ang seksyon ng pattern ng paghahanap.
  • \ 2, \ 1 / g ': Dahil nakapaloob namin ang aming dalawang subexpression sa panaklong, maaari kaming tumukoy sa pareho sa kanila sa kanilang mga numero. Dahil nais naming baligtarin ang order, nai-type namin ang mga ito bilang pangalawang laban, unang laban. Ang mga numero ay dapat na mauna sa pamamagitan ng isang backslash (\).
  • / g: Pinapayagan nito ang aming utos na gumana sa buong mundo sa bawat linya.
  • geeks.txt: Ang file na ginagawa namin.

Maaari mo ring gamitin ang utos ng Cut (c) upang mapalitan ang buong mga linya na tumutugma sa iyong pattern sa paghahanap. Na-type namin ang sumusunod upang maghanap para sa isang linya na may salitang "leeg" dito, at palitan ito ng isang bagong string ng teksto:

sed '/ leeg / c Sa paligid ng aking pulso ay hinugot' coleridge.txt

Ang aming bagong linya ay lilitaw ngayon sa ilalim ng aming katas.

Paglalagay ng Mga Linya at Teksto

Maaari din kaming magpasok ng mga bagong linya at teksto sa aming file. Upang magsingit ng mga bagong linya pagkatapos ng anumang mga tumutugma, gagamitin namin ang utos ng Append (a).

Narito ang file na gagana kaming gagana:

pusa geeks.txt

Nabilang namin ang mga linya upang gawing mas madaling sundin ito.

Na-type namin ang sumusunod upang maghanap para sa mga linya na naglalaman ng salitang "Siya," at naglalagay ng isang bagong linya sa ilalim ng mga ito:

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

Nai-type namin ang sumusunod at isinasama ang Insert Command (ako) upang ipasok ang bagong linya sa itaas ng mga naglalaman ng pagtutugma ng teksto:

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

Maaari naming gamitin ang ampersand (&), na kumakatawan sa orihinal na katugmang teksto, upang magdagdag ng bagong teksto sa isang tumutugma na linya. \1 , \2, at iba pa, kumakatawan sa mga tumutugmang subexpression.

Upang magdagdag ng teksto sa simula ng isang linya, gagamit kami ng isang utos ng pagpapalit na tumutugma sa lahat sa linya, na sinamahan ng isang sugnay na kapalit na pinagsasama ang aming bagong teksto sa orihinal na linya.

Upang magawa ang lahat ng ito, nai-type namin ang sumusunod:

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

Na-type namin ang sumusunod, kasama ang G utos, na magdaragdag ng isang blangko na linya sa pagitan ng bawat linya:

sed 'G' geeks.txt

Kung nais mong magdagdag ng dalawa o higit pang mga blangko na linya, maaari mong gamitin G; GG; G; G, at iba pa.

Pagtanggal ng mga Linya

Ang Tanggalin na utos (d) tinatanggal ang mga linya na tumutugma sa isang pattern ng paghahanap, o ang mga tinukoy sa mga linya ng numero o saklaw.

Halimbawa, upang tanggalin ang pangatlong linya, mai-type namin ang sumusunod:

sed '3d' geeks.txt

Upang tanggalin ang saklaw ng mga linya na apat hanggang lima, i-type namin ang sumusunod:

sed '4,5d' geeks.txt

Upang tanggalin ang mga linya sa labas ng isang saklaw, gumagamit kami ng isang tandang padamdam (!), tulad ng ipinakita sa ibaba:

sed '6,7! d' geeks.txt

Sine-save ang Iyong Mga Pagbabago

Sa ngayon, ang lahat ng aming mga resulta ay naka-print sa window ng terminal, ngunit hindi pa namin nai-save ang mga ito kahit saan. Upang gawing permanente ang mga ito, maaari mong isulat ang iyong mga pagbabago sa orihinal na file o i-redirect ang mga ito sa bago.

Ang pag-overwrite ng iyong orihinal na file ay nangangailangan ng pag-iingat. Kung ang iyong sed mali ang utos, maaari kang gumawa ng ilang mga pagbabago sa orihinal na file na mahirap i-undo.

Para sa kapayapaan ng isip, sed maaaring lumikha ng isang backup ng orihinal na file bago ito magpatupad ng utos nito.

Maaari mong gamitin ang In-place na pagpipilian (-ako) sabihinsed upang isulat ang mga pagbabago sa orihinal na file, ngunit kung magdagdag ka ng isang extension ng file dito, sed ay mai-back up ang orihinal na file sa bago. Magkakaroon ito ng parehong pangalan tulad ng orihinal na file, ngunit may isang bagong extension ng file.

Upang maipakita, hahanapin namin ang anumang mga linya na naglalaman ng salitang "Siya" at tatanggalin ang mga ito. Ire-back up din namin ang aming orihinal na file sa bago gamit ang BAK extension.

Upang magawa ang lahat ng ito, nai-type namin ang sumusunod:

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

Nai-type namin ang sumusunod upang matiyak na ang aming backup file ay hindi nagbabago:

pusa geeks.txt.bak

Maaari din naming mai-type ang sumusunod upang mai-redirect ang output sa isang bagong file at makamit ang isang katulad na resulta:

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

Gumagamit kami pusa upang kumpirmahing ang mga pagbabago ay nakasulat sa bagong file, tulad ng ipinakita sa ibaba:

cat new_geeks.txt

Ang pagkakaroon ng sed Lahat ng Iyon

Tulad ng malamang na napansin mo, kahit na ang mabilis na panimulang aklat na ito ay sed medyo mahaba. Marami sa utos na ito, at marami pang magagawa mo dito.

Gayunpaman, sana, ang mga pangunahing konsepto na ito ay nagbigay ng isang matibay na pundasyon kung saan maaari kang bumuo habang nagpapatuloy kang matuto nang higit pa.


$config[zx-auto] not found$config[zx-overlay] not found