Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: martin 30. 03. 2014, 20:02:54
-
Ahoj,
potrebuju na jednom velmi starem webu pridat do menu dalsi polozku a par dalsich uprav. Web nepouziva PHP, jsou to ciste html soubory. Kdysi byly vygenerovany nejakym programem, ale vlastnik uz k nemu nema puvodni soubory, takze tudy cesta nevede.
Napadlo me vyzit kousek kodu, ktery je na kazde strance a nahradit ho stejnym + novym.
Kdyz si vezmu priklad z root.cz:
<div class="strip-2">
<h4>Hlavní navigace</h4>
<ul id="mainmenu" class="clear">
<li><a href='/clanky/'>Články</a></li>
<li><a href='/zpravicky/'>Zprávičky</a></li>
<li><a href='/specialy/'>Speciály</a></li>
<li><a href="http://forum.root.cz/">Fórum</a></li>
<li><a href="http://blog.root.cz/">Blogy</a></li>
<li><a style="color:#74A46B" href="http://www.zdrojak.cz/">Zdroják</a></li>
<li><a href='/knihy/'>Knihy</a></li>
<li><a href='/man/'>Manuály</a></li>
<li><a href='/specialy/licence/'>Licence</a></li>
<li><a href='/texty/zaklady-linuxu/'>Jak na Linux</a></li>
<li class="skoleni"><a href="/skoleni/">Školení</a></li>
<li><a href='/specialy/jabber/'>Jabber server</a></li>
<li><a href='/texty/butik/'>Butik</a></li>
<li><a href='/prace-v-it/'>Práce v IT</a></li>
</ul>
</div>
Tak bych nahradil
<li><a href='/prace-v-it/'>Práce v IT</a></li>
</ul>
</div>
treba za
<li><a href='/prace-v-it/'>Práce v IT</a></li>
<li><a href='/novy/'>Nova polozka menu</a></li>
</ul>
</div>
souboru je nekolik set v nekolika adresarich. Kod, ktery bych nahrazoval je ve vsech souborech 100% stejny. Celkove budu potrebovat pridat asi 50 radku html kodu.
Muzete mi prosim doporucit nejaky vhodny program?
-
Pokud chcete jen nahrazovat text za text, pak sed (https://cs.wikipedia.org/wiki/Sed). Pokud chcete mít přístup ke stromové struktuře XML, pak je nejlepší použít XSLT transformaci - třeba Saxon (http://www.saxonica.com/welcome/welcome.xml). Ale možná byste nejprve musel HTML převést do XHTML.
-
Kdyby znal sed, tak se tady asi nejspíš vůbec nebude ptát, nemyslíš? Multireplace ve více souborech umí prakticky každý editor (notepad++, pspad, sublime, textmate...)
-
kwrite
-
Ale možná byste nejprve musel HTML převést do XHTML.
No, anebo to rovnou celý přepsat
(http://www.bubblews.com/assets/images/news/565146340_1385946271.jpg)
-
Na jednoduche veci pouzivam neco takoveho:
find . -type f -name '*.html' | xargs -i perl -i -pe 's/co_hledam/cim_nahrazuji/;' {}
Pokud budes matchovat/editovat vice radku, pak bych pouzil nejake sablony pres awk. Prvni vec co mi vypadla z googlu: http://stackoverflow.com/questions/4311915/sed-and-awk-how-to-replace-a-section-of-file-to-another-content (http://stackoverflow.com/questions/4311915/sed-and-awk-how-to-replace-a-section-of-file-to-another-content)
-
XSLT nemuzu pouzit, staci najit a nahradit.
Kwrite, gedit a podobne znam. Ale to mam rucne otevrit nekolik set souboru a vsechno klikat? Mi upadne ruka.
find . -type f -name '*.html' | xargs -i perl -i -pe 's/co_hledam/cim_nahrazuji/;' {}
Jenze moje retezce co_hledam a cim_nahrazuji budou hodne radkove s hromadou uvozovek a dalsich specialnich znaku. Jak se to resi? Musim vsechno escapovat? Exituje na to nejake udelatko?
-
regexp a find&replace in files..
-
Jenze moje retezce co_hledam a cim_nahrazuji budou hodne radkove s hromadou uvozovek a dalsich specialnich znaku. Jak se to resi? Musim vsechno escapovat? Exituje na to nejake udelatko?
grepem (parametry -A a -B) bych to rozdělil na část před a po a pak to spojil před-nový_odkaz-po. Až ti to bude fungovat na jednom souboru, přečti si něco o for cyklech v bashi.
-
KWrite to neumí, ale pokročilejší programátorské editory (já používám jEdit (http://jedit.org/)) umějí nahrazovat hromadně ve více souborech. Není tedy nutné je všechny otvírat a něco klikat, jenom se zvolí, že nahrazování se má provést třeba pro všechny *.html soubory v adresáři a podadresářích.
Pokud je text opravdu všude stejný, může se použít i obyčejné vyhledávání bez žolíků, pak ani nebude potřeba nic escapovat.
V Perlu by se to neřešilo použitím regulárního výrazu a escapováním, ale napsal by se na to krátký skriptík, který by vstupní text hledal na přesnou shodu (pomocí index a substr) a načítal by jej ze souboru.