kuidas hulgi teksti asendada erinevates failides?
Moderaator: Moderaatorid
kuidas hulgi teksti asendada erinevates failides?
On kaustad, igas kaustas on fail ~/v1/cmsimple/config.php.....~/v840/cmsimple/config.php ja seal failis tuleb asendada teema nimi selle kataloogi nimega, mis on ~/v1/templates/ sees.
Selle faili v1/cmsimple/config.php neljas rida on selline:
$cf['site']['template']="subsilverlike";
Seal tuleb see jutumärkide vahel olev nimetus (siin praegu subsilverlike) asendada siis selle kataloogi nimega, mis leitakse ~/v1/templates/ olevat.
Varasem skript jagas teemad ära ent need ei muutu enne aktiivseks kui seadefailis seda öeldud on.
Suutsin niipalju teha, et tekitasin ühe skriptiga tekstifaili, kus need mallide kaustade nimed üksteise all. Kui nüüd saaks need nimed igaüks vastava versiooni config.php faili... Aga lihtsam on vist otse teha kui mingit vahefaili kasutada.
Mõned viited olen leidnud:
http://www.webhostingtalk.com/showthread.php?t=545248
http://www.linuxquestions.org/questions ... p?t=212983
http://www.linuxquestions.org/questions ... p?t=278332
... ja olen aru saanud, et sed, awk vms. on selleks mõeldud... Ent seni ei ole miskit töötavat skripti suutnud välja mõelda selle analoogia põhjal...
isegi sed 's/vana_nimi/uus_nimi/' <config.php >config.php ei tööta. Fail config.php on tühi peale seda....
Selle faili v1/cmsimple/config.php neljas rida on selline:
$cf['site']['template']="subsilverlike";
Seal tuleb see jutumärkide vahel olev nimetus (siin praegu subsilverlike) asendada siis selle kataloogi nimega, mis leitakse ~/v1/templates/ olevat.
Varasem skript jagas teemad ära ent need ei muutu enne aktiivseks kui seadefailis seda öeldud on.
Suutsin niipalju teha, et tekitasin ühe skriptiga tekstifaili, kus need mallide kaustade nimed üksteise all. Kui nüüd saaks need nimed igaüks vastava versiooni config.php faili... Aga lihtsam on vist otse teha kui mingit vahefaili kasutada.
Mõned viited olen leidnud:
http://www.webhostingtalk.com/showthread.php?t=545248
http://www.linuxquestions.org/questions ... p?t=212983
http://www.linuxquestions.org/questions ... p?t=278332
... ja olen aru saanud, et sed, awk vms. on selleks mõeldud... Ent seni ei ole miskit töötavat skripti suutnud välja mõelda selle analoogia põhjal...
isegi sed 's/vana_nimi/uus_nimi/' <config.php >config.php ei tööta. Fail config.php on tühi peale seda....
Re: kuidas hulgi teksti asendada erinevates failides?
zeroconf kirjutas:isegi sed 's/vana_nimi/uus_nimi/' <config.php >config.php ei tööta. Fail config.php on tühi peale seda....
Kood: Vali kõik
perl -pi'*.bak' -e 's/vana_nimi/uus_nimi/' config.php Kood: Vali kõik
perl -pi'*.bak' -e 's/vana_nimi/uus_nimi/g' config.php sed töötab ka
Kood: Vali kõik
sed -i config.php -e 's/vana_nimi/uus_nimi/'
Viimati muutis priit, 07.08.2007, 00:05, muudetud 2 korda kokku.
ei ole vaja kogu teksti vaid ainult jutumärkide vahel olev tekst asendada kataloogi nimega, mis ~/v1/cmsimple/templates/ kaustast leitakse:Hardi kirjutas:sed -i "4c\uus_nimi" /bath/failinimi
vahetab teksti faili 4-ndal real
$cf['site']['template']="subsilverlike";
... ja seda on vaja 840 korda teha, iga kord on kataloogi nimi erinev (v1....v840).
Kuidas teha nii, et sed'ile ei peaks ette andma "vana_nimi" vaid saaks anda nii, et mida ta sealt ~/v1/cmsimple/config.php failis 4-ndalt realt jutumärkidest leiab, seda võtkugi vana nimena. Ja uue nimena võtku seda, mis leitakse kataloogi nimi olevat ~/v1/cmsimple/templates/ kaustas
Hädapärast panna "uus_nimi" väärtuseks ka:
$cf['site']['template']="`ls ~/v1/cmsimple/templates/`";
Üritasin sellist skripti rakendada:
Kood: Vali kõik
#!/bin/sh
cms_asukoht="/kataloog/kus/asub/840_kataloogi"
var=1
until [ $var1 -ge $1 ]
do
sed -i "4c\$cf['site']['template']="`ls $cms_asukoht/v$var/cmsimple/templates`";" $cms_asukoht/v$var/cmsimple/config.php
((var1+=1))
done
Kood: Vali kõik
line 4: [: -ge: unary operator expected
ls: /kataloog/kus/asub/840_kataloogi/v1/cmsimple/templates: No such file or directory
Lahendasin hetkel asja "kirvemeetodil":
1) tekitasin kataloogide nimekirja üksteise alla, kirjutades alltoodud read bashi skripti:
ls v1/templates/ > mallide_nimed.txt
ls v2/templates/ >> mallide_nimed.txt
.....
ls v840/templates/ >> mallide_nimed.txt
Kusjuures need read sain nii, et tekitasin OOo Calc'is mitu veergu selliselt, et number oli eraldi veerg. Siis andsin sammu ette (1,2) paljundasin seeria alla 840 reani. Siis CONCATENATE funktsiooniga liitsin taas kokku tagasi ja sellegi valemi paljundasin topeltklõpsuga lahtri alumisel paremnurgal alla 840 rea võrra. Siis kopeerisin saadud read bashi skripti, salvestasin, käivitasin ja oligi fail mallide nimedega olemas.
Siis kopeerisin saadud kataloogide nimed taas Calc-i ühte veergu ülevalt alla.
2) sama tehnikaga rakendasin rida:
sed -i /kataloog/kus/asub/840_kataloogi/v1/cmsimple/config.php -e 's/vana_nimi/uus_nimi/'
...
sed -i /kataloog/kus/asub/840_kataloogi/v840/cmsimple/config.php -e 's/vana_nimi/uus_nimi/'
... kus uus nimi oli Calc'i kopeeritud mallide nime lahtrist lihtsalt võrdusmärgiga viidatud. Taas CONCATENATE abil see rida kokku, skripti, käima ja oligi olemas.
Seal kus oli nimi juba muudetud - sealt seda "vana_nimi" enam ei leitud ja ilmselt siis ka midagi ei muudetud. Kindlasti saaks miski andeka skripti kirjutada, mis selle korraga ära teeks aga minu vägi sellele praegu peale ei hakanud kuigi uurisin neid juhendeid. Liiga palju uut infot, mida juurde lugeda enne kui üldse midagi juhtuma hakkab. Kui ei ole ikka progeja siis on keeruline nendest laias netis olevatest õpetustest aru saada, mis sageli suhteliselt lakoonilised on.
Katsetasin natuke, vajaliku töö sain tehtud järgmise skriptiga (kaustade asukohad olid mul natuke teised, rida oli ka kuues, mitte neljas):
Kood: Vali kõik
#!/bin/bash
cms="/home/priit/test"
for i in `seq 1 840`
do
newtpl="`ls $cms/v$i/templates`"
sed 6c\$cf[\'site\'][\'template\']=\"$newtpl\" -i $cms/v$i/config.php
doneSuper - asi tõepoolest töötas! Ma katsetasin seda 5 CM Simple kausta peal ja toimis täiuslikult. Samuti selgus tähelepanelikul vaatlemisel, et soovitud rida oli viies. Veel selgus testimisel, et semikoolon oli puudu - kui seda ei ole siis veebileht ei tööta.priit kirjutas:Katsetasin natuke, vajaliku töö sain tehtud järgmise skriptiga (kaustade asukohad olid mul natuke teised, rida oli ka kuues, mitte neljas)
done[/code]
Kate abiga reanumbrid sisse lülitades sai selguse majja. Ühtlasi sain ka aru, et osaliselt on keeruline rida asendada - lihtsam on terve rida soovituga asendada.
Minu testitud versioon siis selline:
Kood: Vali kõik
#!/bin/bash
cms="/kataloog/kus/asuvad/CMS-i_kataloogid"
for i in `seq 1 5`
do
newtpl="`ls $cms/v$i/templates`"
sed 5c\$cf[\'site\'][\'template\']="$newtpl"\; -i $cms/v$i/cmsimple/config.php
done
Teistele lugemiseks - käesolev teema sai alguse siit - http://pingviin.org/viewtopic.php?t=3352 kuid siis tekkis uus vajadus ja selle kohta siis see haru siin.
Jah, newtpl on suvaliselt valitud nimi. V6id newtpl asemel suvalist muutuja nime kasutada.zeroconf kirjutas: Minu testitud versioon siis selline:Kas see muutuja "newtpl" on suvaliselt valitud? Et näiteks vajadusel saaks "newtpl2" jne. valida...Kood: Vali kõik
#!/bin/bash cms="/kataloog/kus/asuvad/CMS-i_kataloogid" for i in `seq 1 5` do newtpl="`ls $cms/v$i/templates`" sed 5c\$cf[\'site\'][\'template\']="$newtpl"\; -i $cms/v$i/cmsimple/config.php done
Teistele lugemiseks - käesolev teema sai alguse siit - http://pingviin.org/viewtopic.php?t=3352 kuid siis tekkis uus vajadus ja selle kohta siis see haru siin.

