kuidas hulgi teksti asendada erinevates failides?

Kui vajad mõnda eestikeelset õpetust, juhendit, ülevaadet, siis küsi seda siin

Moderaator: Moderaatorid

Vasta
zeroconf
Vana Pingviin
Vana Pingviin
Postitusi: 1069
Liitunud: 31.03.2007, 16:10

kuidas hulgi teksti asendada erinevates failides?

Postitus Postitas zeroconf »

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....
priit
Vana Pingviin
Vana Pingviin
Postitusi: 521
Liitunud: 04.08.2005, 03:00

Re: kuidas hulgi teksti asendada erinevates failides?

Postitus Postitas priit »

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 
Asendab teeb ÜHE korra asenduse vana_nimi => uus_nimi, kui kõiki on vaja, siis

Kood: Vali kõik

perl -pi'*.bak' -e 's/vana_nimi/uus_nimi/g' config.php 
Internet aitab.

sed töötab ka :)

Kood: Vali kõik

sed -i config.php -e 's/vana_nimi/uus_nimi/'
st lihtsalt käsurealt sed'i käivitades tegeleb ta stdin-iga, faili jaoks on vaja kasutada võtit -i (edit files in place).
Viimati muutis priit, 07.08.2007, 00:05, muudetud 2 korda kokku.
Kasutaja avatar
Hardi
Pingviini aktivist
Pingviini aktivist
Postitusi: 153
Liitunud: 31.10.2005, 02:00

Postitus Postitas Hardi »

sed -i "4c\uus_nimi" /bath/failinimi

vahetab teksti faili 4-ndal real
zeroconf
Vana Pingviin
Vana Pingviin
Postitusi: 1069
Liitunud: 31.03.2007, 16:10

Postitus Postitas zeroconf »

Hardi kirjutas:sed -i "4c\uus_nimi" /bath/failinimi

vahetab teksti faili 4-ndal real
ei ole vaja kogu teksti vaid ainult jutumärkide vahel olev tekst asendada kataloogi nimega, mis ~/v1/cmsimple/templates/ kaustast leitakse:
$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 
kuid veateateks tuleb:

Kood: Vali kõik

line 4: [: -ge: unary operator expected 
ls: /kataloog/kus/asub/840_kataloogi/v1/cmsimple/templates: No such file or directory
.... kuigi selline kaust (/cmsimple/templates) on täiesti olemas...

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.
priit
Vana Pingviin
Vana Pingviin
Postitusi: 521
Liitunud: 04.08.2005, 03:00

Postitus Postitas priit »

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
done
zeroconf
Vana Pingviin
Vana Pingviin
Postitusi: 1069
Liitunud: 31.03.2007, 16:10

Postitus Postitas zeroconf »

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]
Super - 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.

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
Kas see muutuja "newtpl" on suvaliselt valitud? Et näiteks vajadusel saaks "newtpl2" jne. valida...

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.
priit
Vana Pingviin
Vana Pingviin
Postitusi: 521
Liitunud: 04.08.2005, 03:00

Postitus Postitas priit »

zeroconf kirjutas: 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
Kas see muutuja "newtpl" on suvaliselt valitud? Et näiteks vajadusel saaks "newtpl2" jne. valida...

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.
Vasta