Skripta Find-Replace u svim *.HTML fajlovima

2

Skripta Find-Replace u svim *.HTML fajlovima

offline
  • IvanC 
  • Ugledni građanin
  • Pridružio: 30 Jun 2009
  • Poruke: 400

soxxx :: Kao što rekoh, daj jos neki komplikovaniji primer pa da vidimo šta može da se uradi.Hajde kada već imaš volje ;-)
U postu iznad dao sam primjer ali evo opet

TRAŽI kompletan kod (5 linija koda):
<table border="0" width="100%">    <tr>       <td>tablica</td>    </tr> </table>

REPLACE kompletan kod (ovaj kod se nalazi u replace.txt):
<table border="0" width="100%">          <tr>             <td width="141">1</td>             <td rowspan="2">2</td>          </tr>          <tr>             <td width="141">3</td>          </tr>       </table>

Dakle sve što je pod TRAŽI treba zamjeniti sa kodom u fajlu "replace.txt"
Tu je problem što ima 5 linija koda a može se dogoditi da bude ponekada i više. Ako je problem nemoj se mučiti, rješavat ću na drugi način ;-)



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • soxxx 
  • Prijatelj foruma
  • Pridružio: 25 Maj 2005
  • Poruke: 1482
  • Gde živiš: Gracanica, Kosovo

Mislio sam na nešto drugo, za ovo već imaš gore rešenje.

U tvom primeru zapravo se razlikuje samo jedna linija, zato sam i stavio pretragu samo za <td>tablica</td>, i na to mesto ubacio ostalih 5 linija.
Još nešto, ovo sve vredi ako imaš recimo 50-tak html fajlova, ako je samo par komada onda sve ide ručno.

Preporučio bih ti još da pogledaš i xgawk, to je alat sličan [m]awk-u, specijalno namenjen parsiranju XML (i html) koda:

http://home.vrweb.de/~juergen.kahrs/gawk/XML/

Mislim da se trenutno slabije razvija, ali svakako izuzetan alat, sa veoma dobrom dokumentacijom. Zaista prava stvar. Ako imaš kod koji je različit, ali se recimo ponavlja šema, npr. uvek je 5 linija, ili, uvek je neki tag isti, onda to možeš iskoristiti za pretragu. Ako je kod uvek različit, onda... Wink



offline
  • IvanC 
  • Ugledni građanin
  • Pridružio: 30 Jun 2009
  • Poruke: 400

soxxx ::Mislio sam na nešto drugo, za ovo već imaš gore rešenje.
U tvom primeru zapravo se razlikuje samo jedna linija, zato sam i stavio pretragu samo za <td>tablica</td>, i na to mesto ubacio ostalih 5 linija.
Sada sam i ja shvatio što si htio reći ;-)
Mijenjam samo dio koji je različit od tražene linije koda.

Pokušat ću ti opisati zašto sadašnji princip može biti neodgovarajući.
Kada imam više *.html fajlova koji u sebi sadrže više sličnog koda poput ovoga

IMAM ovaj source kod (dvije tablice sa 100%)
<table border="0" width="100%">    <tr>       <td>tablica</td>    </tr> </table> <table border="0" width="100%">    <tr>       <td>tablica2</td>    </tr> </table>

TRAŽIM dio koda koji se odnosi na tablicu 2 i želim umjesto 100% staviti 50%
<table border="0" width="100%">    <tr>       <td>tablica2</td>

MIJENJAM SA
<table border="0" width="50%">    <tr>       <td>tablica2</td>

To na ovaj način ne mogu jer imam više tablica koje imaju 100%, ako bi išao samo na jednu liniju koda tada bi pobrkao ostale tablice koje imaju 100%, znači moram se vezati na širinu koda da bi bio siguran da je to ono što će mi se promijeniti, Tako da bi uz program koji dobro radi sa parsiranjem HTML koda i fajlovima find.txt i replace.txt rješavao problem.

Hvala ti na savjetima i nesebičnom trudu
U principu UE rješava daljnje probleme, ali ovo tvoje rješenje brže odradi posao a i ja tražim free način.
Ovo tvoje mi je pomoglo u prvom koraku što UE ne može (brisanje kompletnog koda sa linijama). UE može obristi sav kod ali ostanu linije.

Što se mene tiče tema može biti zatvorena osima ako netko ima rješenje slično tvome (jer je idealno) pomoću dva fajla "find.txt" i "replace.txt" gdje bi mogao tražiti i zamjeniti dio koda sa više linija.

hvala još jednom na pomoći
pozz

offline
  • soxxx 
  • Prijatelj foruma
  • Pridružio: 25 Maj 2005
  • Poruke: 1482
  • Gde živiš: Gracanica, Kosovo

Mislim da imam ideju kako se ovo može izvesti, samo mi moraš navesti jos neki primer šta i kako menjas u kodu. Nažalost trenutno nemam vremena, a ako ti nije kasno do sledeće nedelje onda mogu da se vratim na ovo. Smile

U medjuvremenu evo ti nešto da se zanimaš, za ovaj gornji primer:

rep.bat:
mawk.exe -vtrazi="%1" "$0~trazi{sub(/100/,"50",a[NR-2])}{a[NR]=$0}END{for(i in a)print a[i]}" test\trazeniKod.html
Onda mozes da ga pokreces ovako:
tmp> type test\trazeniKod.html <table border="0" width="100%">    <tr>       <td>tablica</td>    </tr> </table> <table border="0" width="100%">    <tr>       <td>tablica2</td>    </tr> </table> tmp> rep.bat tablica./ </table> <table border="0" width="50%">    <tr>       <td>tablica</td>    </tr> </table> <table border="0" width="100%">    <tr>       <td>tablica2</td>    </tr> tmp> rep.bat tablica2 </table> <table border="0" width="100%">    <tr>       <td>tablica</td>    </tr> </table> <table border="0" width="50%">    <tr>       <td>tablica2</td>    </tr>
Parametar zadaješ dinamički. Vidimo da je u oba slučaja ispravno izmenjen kod. Wink

offline
  • IvanC 
  • Ugledni građanin
  • Pridružio: 30 Jun 2009
  • Poruke: 400

Vidim da si entuzijasta poput mene i voljan si nesebično pomoći i dati si truda. Kad je tako i ja ću si dati truda za daljnje pojašnjenje u ovom podužem postu ;-)

Teško da ti mogu dati još neki primjer jer ovisi od slučaja do slučaja. Ponekada imam kod koji sadrži 5 linija a ponekada 10 ili 15 linija koda. Ovdje sam dao primjer samo za promjenu širine tablice no ponekada će mi trebati dio koda između dvije tablice i koji tražim pa ću umetnuti dio novog koda koji će dodati još jednu tablicu itd itd. Teško mi je za opisati jer sam svašta do sada radio. (Tako da mi je najbolje rješenje preko "find.txt" i "replace.txt" ali koliko vidim to je nemoguće izvesti na ovako jednostavan i brz način)

Laičkim jezikom rečeno (a vjerujem da ti to razumiješ) no zbog drugih čitalaca teme koji možda žele isto.
Dakle traži se skripta koje će reći slijedeće: U svim HTML fajlovima "C:\test" foldera i subfoldera potraži kod iz fajla "find.txt" i zamjeni ga kodom iz fajla "replace.txt"
Znači da se ne mora mijenjati ništa u *.BAT fajlu

Koliko vidim ovaj tvoj kod je za individualna rješenja što može stvarati problem jer svaki
puta moram mijenjati kod u *.BAT fajlu da bi odradio neku zamjenu na više *.html fajlova. Što je za nekog programera "sitnica" ali za laika problem. To je moje mišljenje.

Ovaj zadnji post i nisam baš najblje razumio (nisam programer i ne kužim sve parametre i sintakse). Koliko sam sada shvatio moram u folderu imati novi fajl "trazeniKod.html" u kojem trebam postaviti kod koji tražim i želim zamjeniti, u rep.bat fajlu je postavljeno /100/ da se zamjeni sa "50".

Što sam uradio?

PRVI KORAK:
Kreirao sam "C:\test" folder i u njega postavio "rep.bat" i "trazeniKod.html" kao i "mawk.exe".

DRUGI KORAK:
Dio koda koji si postavio u postu umetnuo sam u "rep.bat" pa on izgleda ovako
 setlocal EnableDelayedExpansion cd C:\test for /f "tokens=*" %%d in ('dir /b/a/s *.html') do (    set ime=%%~nd%    set fajl="%%d"   mawk.exe -vtrazi="%1" "$0~trazi{sub(/100/,"50",a[NR-2])}{a[NR]=$0}END{for(i in a)print a[i]}" test\trazeniKod.htmlProbao sam izbaciti srednji dio ovog koda ali opet nema rezultata (sorry na mom neznanju)

TREĆI KORAK:
U fajl "trazeniKod.html" postavio sam kod koji izgleda ovako
 <table border="0" width="100%">    <tr>       <td>tablica</td>    </tr> </table> <table border="0" width="100%">    <tr>       <td>tablica2</td>    </tr> </table>

ČETVRTI KORAK:
Pokrenuo "rep.bat" ali nema nikakvih promjena na *.html fajlovima

Da ja tebe sada ne bi zbunjivao ovo su tri fajla na koja ciljam promjene i njihov source kod u kojem je trebalo zamijeniti samo širinu "tablice2" sa 100 na 50. Vidim da si ti nešto napravio ali me zbunjuje drugi kod (tmp> rep.bat tablica./) koji je nepotreban ??? Rješenje je treći kod

Dakle imam tri različita slučaja (za ovaj primjer), sa po tri tablice a meni je važna tablica u kojoj piše "tablica2" jer nju želim smanjiti na 50

=>Fajl C:\test\1.html <html> <head> <meta http-equiv="Content-Language" content="hr"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1250"> <title>New Page 1</title> </head> <body> <table border="0" width="100%">    <tr>       <td>tablica</td>    </tr> </table> <table border="0" width="100%">    <tr>       <td>tablica2</td>    </tr> </table> </body> </html> ------------------------------ =>Fajl C:\test\ostali_html\2.html <html> <head> <meta http-equiv="Content-Language" content="hr"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1250"> <title>New Page 2</title> </head> <body> <table border="0" width="100%">    <tr>       <td>tablica</td>    </tr> </table> <table border="0" width="100%">    <tr>       <td>tablica2</td>    </tr> </table> <table border="0" width="100%">    <tr>       <td>tablica3</td>    </tr> </table> </body> </html> ------------------------------- =>Fajl C:\test\ostali_html\3.html <html> <head> <meta http-equiv="Content-Language" content="hr"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1250"> <title>New Page 3</title> </head> <body> <table border="0" width="100%">    <tr>       <td>tablica</td>    </tr> </table> <table border="0" width="100%">    <tr>       <td>tablica2</td>    </tr> </table> <table border="0" width="100%">    <tr>       <td width="180">tablica3</td>       <td> </td>    </tr> </table> </body> </html>

BTW: uočio sam da iza navedenog koda tj. određene linije koda ne smije biti nikakav "blanko znak" jer to može stvarati problem, a to se događa (znači da bi morao svaku liniju koda pregledati pažljivo). Ovako samo u program UE kopiram ono što tražim. No ovo je nebitno za ovu temu i nemoj da te zbunjuje.

PROBLEM SAM RIJEŠIO:
Sa UE tako što sam u polje za

FIND upisao
 <table border="0" width="100%">    <tr>       <td>tablica2</td>  

A u polje

REPLACE WITH upisao
 <table border="0" width="50%">    <tr>       <td>tablica2</td>  

Tako sam si osigurao da u stotinu *.html fajlova koje imam program promijeni samo navedeni kod koji je strukturno identičan traženom.

Globalno gledajući problem sam riješio pomoću tvog prvog primjera (koji mi je dragocjen) sa "over.txt" fajlom jer je obrisao sve što ima od source u *.html i zamijenio sa jednom jedinom linijom koda koja mi je poslužila za daljnji rad a ostatak riješio sa UE

I dalje bih želio imati FREE način rješavanja ovog problema po principu "copy-paste-click" sa dva u ovom slučaju bitna fajla "find.txt" i "replace.txt". Ali koliko vidim ima tu više elemenata zbog kojih je to na ovakav način neizvedivo. (vjerojatno za to i postoje specijalizirani programi za to)

I na kraju krajeva, meni se ne žuri. Bilo bi mi drago da ima još koji entuzijasta sa prijedlozima rješenja na način koji tražim ;-)

Hvala ti
pozz

offline
  • soxxx 
  • Prijatelj foruma
  • Pridružio: 25 Maj 2005
  • Poruke: 1482
  • Gde živiš: Gracanica, Kosovo

Napisano: 14 Okt 2010 23:27

IvanC ::Ovaj zadnji post i nisam baš najblje razumio (nisam programer i ne kužim sve parametre i sintakse). Koliko sam sada shvatio moram u folderu imati novi fajl "trazeniKod.html" u kojem trebam postaviti kod koji tražim i želim zamjeniti, u rep.bat fajlu je postavljeno /100/ da se zamjeni sa "50".

Smile Prvo izvini - pogrešno sam pretpostavio da se malo razumeš u skriptovanje. Jednostavno sam hteo da ti dam neki predlog koji ćeš ti dalje razraditi. Zbog toga nisam ostavio kompletnu skriptu, i nisam detaljnije objasnio šta je šta.

Dakle ovako, ne trebas imati fajl 'trazeniKod.html', to je samo primer kod mene za fajl čiji kod treba izmeniti. Evo kompletnog rep.bat fajla:
setlocal EnableDelayedExpansion cd C:\test for /f "tokens=*" %%d in ('dir /b/a/s *.html') do (    set ime=%%~nd%    set fajl="%%d"        mawk.exe -vtrazi="%1" -vprocenat="%2" -vzamena="%3" "$0~trazi{sub(procenat, zamena, a[NR-2])}{a[NR]=$0}END{for(i=1;i<=NR;i++)print a[i]}" !fajl! >%TEMP%\!ime!    move /y %TEMP%\!ime! !fajl! )
Dobro si primetio za prazna polja. To se dešava zato što skriptu pišem u Notepad-u, koji izgleda ostavlja prazno polje na kraju reda, pa ti to prazno polje dobijes kada uradis copy koda.
Skriptu sam napisao tako da možeš da menjas parametre prilikom pozivanja skripte. Recimo:
rep.bat tablica./ 100 20
Skripta menja kod iz "tablica" bloka (ova tacka je regex znak, i oznacava bilo koji karakter, u ovom slucaju "<" nakon reci "tablica". Znak "/" je samo znak koji prati kod --> "tablica</td>".

rep.bat tablica3 100 50
Skripta menja kod iz "tablica3" bloka iz 100% u 50%, itd.
Skripta pretpostavlja da se širina uvek nalazi 2 linije iznad trazene reči (kao što je slučaj kod tvojih primera).

Dopuna: 14 Okt 2010 23:32

Ah, da ' sta je kog vraga UE?! Very Happy

offline
  • bocke  Male
  • Moderator foruma
  • Glavni moderator Linux foruma
  • Veliki Pingvin
  • Guru
  • Pridružio: 16 Dec 2005
  • Poruke: 12277
  • Gde živiš: Južni pol

soxxx ::Ah, da ' sta je kog vraga UE?! Very Happy

UltraEdit. Wink

offline
  • IvanC 
  • Ugledni građanin
  • Pridružio: 30 Jun 2009
  • Poruke: 400

soxxx ::
Prvo izvini - pogrešno sam pretpostavio da se malo razumeš u skriptovanje.

Ah, da ' sta je kog vraga UE?! Very Happy
Eh, ne možemo svi sve znati Wink

Sada mi je jasnije a skužio sam da naredbu rep.bat tablica2./ 100 50 treba pokretati iz CMD prozora i program je uredno odradio svoje.



Ovim bi ja zatvorio raspravu na ovu temu a tebi se zahvalio na nesebičnoj pomoći (idem dalje sa rješavanjem drugih problema ;-)
pozz

Ko je trenutno na forumu
 

Ukupno su 470 korisnika na forumu :: 35 registrovanih, 4 sakrivenih i 431 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3028 - dana 22 Nov 2019 07:47

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: _Sale, A.R.Chafee.Jr., Apok, boki199777, Cranium, CrazyDiablo, Dimitrise93, djboj, Dorcolac, Drug pukovnik, goflja76, goxin, lord sir giga, Marko Marković, MB120mm, milekNS, MiroslavD, Miskohd, Mitraljeta, nemkea71, nuke92, Oscar2, panzerwaffe, Petar J, plavii, Recce, sizif, sombrero, stegonosa, suton, tomigun, vlvl, yrraf, zixmix, zoxknez