Newsgroup: it.comp.os.linux.iniziare
Titolo: sed - cambiare righe di codice html

Tempo fa qualcuno mi aveva suggerito il modo di cambiare (eliminare e 
poi aggiungere?) righe di codice html in più file contemporaneamente con 
sed.
Non riesco più a trovare il file dove lo avevo salvato.
Nonostante legga e rilegga il manuale di sed, non ci riesco e ormai sono 
nel caos. Riesco solo a cambiare le parole dove non compaiano segni del 
tipo ( / = < ecc.
Che fò?
X



Magari mettere un esempio di cosa stai cercando di fare?

 Magari mettere un esempio di cosa stai cercando di fare?
vorrei sostituire in un gruppo di file html queste righe di codice:
<div id="navigation">
<ul>
<li><a href="javascript:;" onclick="buttonClick(event, 
0)"><span>Alix</span></a></li>
<li><a href="javascript:;" onclick="buttonClick(event, 1)"><span>La 
Bottega</span></a></li>
<li><a href="javascript:;" onclick="buttonClick(event, 2)" 
class="manufatti"><span>Manufatti</span></a></li>
<li><a href="../argento/argento.htm"><span>Argento</span></a></li>
<li><a href="javascript:;" onclick="buttonClick(event, 5)" 
class="contatti"><span>Contatti</span></a></li>
<li><a href="../jewels.htm"><span>English</span></a></li>
</ul>
</div>
<div id="submenu">
</div>
<script type="text/javascript" src="js-css/submenu.js"></script>
con queste:
<div id="submenu">
<a href="../gioielli.htm"><span>Italiano</span></a>
|
<a href="../jewels.htm"><span>English</span></a>
</div>
si pòle?
X



potere si pòle, ma di sicuro hai sbagliato a scrivere l'esempio, perchè
non ha molto senso.

 non ha molto senso.
perchè no?
ho provato a togliere righe con sed... e toglie anche quello che non 
deve togliere... vabè ho fatto a mano (merda).
è sbagliato come codice oppure è sbagliato pretendere di usare sed?
'nzomma checcià che non va?
X

 'nzomma checcià che non va?
è sbagliato dire di voler trasformare queste:
<div id="navigation">
<ul>
<li><a href="javascript:;" onclick="buttonClick(event, 
0)"><span>Alix</span></a></li>
<li><a href="javascript:;" onclick="buttonClick(event, 1)"><span>La 
Bottega</span></a></li>
<li><a href="javascript:;" onclick="buttonClick(event, 2)" 
class="manufatti"><span>Manufatti</span></a></li>
<li><a href="../argento/argento.htm"><span>Argento</span></a></li>
<li><a href="javascript:;" onclick="buttonClick(event, 5)" 
class="contatti"><span>Contatti</span></a></li>
<li><a href="../jewels.htm"><span>English</span></a></li>
</ul>
</div>
<div id="submenu">
</div>
<script type="text/javascript" src="js-css/submenu.js"></script>
in queste:
<div id="submenu">
<a href="../gioielli.htm"><span>Italiano</span></a>
|
<a href="../jewels.htm"><span>English</span></a>
</div>
nella parte iniziale hai due blocchi div ed uno js
nella seconda un solo blocco div e nessun js
nella prima parte hai nel primo blocco div (id=navigation) dei link,  ma
visto che nella seconda quel blocco non lo vuoi devo capire che devi
potare via tutti quei link?
e invece da dove vorresi ricavarli i link che sono misteriosamente apparsi
nel blocco div id=submenu nella seconda. visto che nello stesso blocco
blocco della prima non c'erano?
nella seconda hai questo link:
<a href="../gioielli.htm"><span>Italiano</span></a>
ecco questo te lo sei proprio inventato perchè nella prima non c'era
niente del genere.
in pratica ecco quello che vorresti facesse lo script:
cancella il primo div. Di tutti ilink che erano presenti nel primo
div, prendi solo l'ultimo (non vedo un altro valido criterio per dover
selezionare solo quello) e mettilo nel secondo div. Infine, nel secondo
div aggiungi un nuovo link a caso!
ora ragionaci meglio e fai un esempiio consistente :)

 ora ragionaci meglio e fai un esempiio consistente :)
caspita che analisi attenta!
m'hai impressionato.
veramente.
allora:
ho un blocco div "navigation" contenente un elenco orizzontale di link, 
alcuni del tipo: <li><a href="../jewels.htm"><span>English</span></a></li>
ed altri del tipo:
<li><a href="javascript:;" onclick="buttonClick(event, 
5)"class="contatti"><span>Contatti</span></a></li>
questi ultimi aprono sul secondo blocco div "submenu" gruppi di altri 
link che sono specificati nel file submenu.js
Quello che voglio fare è potare il primo blocco e lasciare il secondo 
che in termini grafici è una striscina rossa (diversa quindi da tutti 
gli altri menù delle altre pagine e che perciò fa intuire bene la 
differenza). Utilizzo il blocco submenu che già c'è per non rifare altro 
css da capo.
In questo secondo blocco voglio mettere i due link che tu hai definito 
"a caso" ma che in realtà linkano a pagine esistenti.
Questo perchè ho le stesse pagine sia in italiano che in inglese, la cui 
funzione è soprattutto quella di mostrare immagini con descrizione 
minimale (non posso farle doppie!: troppo lavoro e spazio inutile 
occupato). Perciò dalle pagine di immagine vorrei che non si vedesse 
tutto il menù, ma solo la possibilità di tornare alla pagina dove sono 
raggruppate le thumb., quella in italiano o quella in inglese.
...si capisce?
:-\
X

 ...si capisce?
Ma perche' non incolli pari pari uno di quei blocchi "div", assieme ad un
altro testo che mostri *per intero* il risultato corrispondente voluto?
Esempio:
COSA HO ADESSO:
<div id="navigation">....blahblah
qui metti TUTTO il testo esattamente come e' adesso. Se puoi anche indicare
i ritorni a capo e' meglio, perche' molti newsreader vanno a capo
automaticamente se ci sono linee molto lunghe (magari metti un simbolo al
termine della riga quando c'e' un ritorno a capo)
</div>
COME VORREI CHE IL TESTO SOPRA DIVENTASSE:
come sopra, metti il testo COMPLETO.

 come sopra, metti il testo COMPLETO.
l'ho già fatto.
ma lo rifò:
<div id="navigation">
<ul>
<li><a href="javascript:;" onclick="buttonClick(event, 
0)"><span>Alix</span></a></li>
<li><a href="javascript:;" onclick="buttonClick(event, 1)"><span>La 
Bottega</span></a></li>
<li><a href="javascript:;" onclick="buttonClick(event, 2)" 
class="manufatti"><span>Manufatti</span></a></li>
<li><a href="../argento/argento.htm"><span>Argento</span></a></li>
<li><a href="javascript:;" onclick="buttonClick(event, 5)" 
class="contatti"><span>Contatti</span></a></li>
<li><a href="../jewels.htm"><span>English</span></a></li>
</ul>
</div>
<div id="submenu">
</div>
<script type="text/javascript" src="js-css/submenu.js"></script>
VORREI CHE IL TESTO SOPRA DIVENTASSE:
<div id="submenu">
<a href="../gioielli.htm"><span>Italiano</span></a>
|
<a href="../jewels.htm"><span>English</span></a>
</div>
che mi devo inventare di più? (o di meno...).
ok ho capito: non si pòle. Solo copiencolla.
X

 VORREI CHE IL TESTO SOPRA DIVENTASSE:
Allora ti chiedo un'altra cosa: quel testo che vorresti cambiare appare solo
una volta nel file? E' sempre formattato allo stesso modo (intendo come
ritorni a capo)? In altre parole, se io scrivo un programma che riconosce
un blocco di testo che comincia con "div id="navigation..." e termina
con "/script", ho la garanzia che il testo riconosciuto sia esattamente
quello che tu vuoi cambiare oppure potrebbe dare falsi positivi?

antani ha scritto:

solo una volta.
formattato sempre allo stesso modo.
non si sbaglia.
X



NOTA: nel testo che segue, "<" e ">" sono sostituiti da % e -, visto che
aioe sega i messaggi che apparentemente contengono html. Devi quindi
cambiare il codice sed in modo che "%" diventi "<" e "-" diventi ">" (vedi
oltre per istruzioni).
Ok, crea un file "prog.sed" con questo codice:
/^%div id="navigation"/,/%\/script-$/{
  /%\/script-$/!d
  s:.*:%div id="submenu"-\n%a
href="../gioielli.htm"-%span-Italiano%/span-%/a-\n|\n%a
href="../jewels.htm"-%span-English%/span-%/a-\n%/div-:
}
e poi, per ottenere il vero programma, fai
tr '%-' '<>' < prog.sed > prog_ok.sed
quindi usalo sul tuo file html con
sed -f prog_ok.sed file.html
e vedi se funzia.

 }
La riga che comincia con "s:.*".... e' in realta' una singola riga, che
termina con "/div-:", quindi nel tuo file devi scriverla come una sola
linea.

 ok ho capito: non si pòle. Solo copiencolla.
doveva essere una sfida? :)
toh, salvalo come alix_stai_calma.php
dagli i permessi di esecuzione, ed eseguilo così:
./alix_stai_calma.php /path/al/file/da/parsare.html
attenzione, ho considerato il fattoche il codice che hai scritto fosse
tutta,la pagina, nel senso che se lo esegui in nu file con altri tag ,
questi vengono potati tutti, per mantenerli c'è da aggiungere un paio di
comandi
#!/usr/bin/php
<?php
	function parse_array($string, $beg_tag, $close_tag)
	{
		preg_match_all("($beg_tag(.*)$close_tag)siU", $string, $matching_data);
		return $matching_data[0];
	}
	$parsed = "<div id=\"navigation\">\n";
	$fd = fopen($argv[1], "r");
	$buff = fread($fd, filesize($argv[1]));
	$div1 = parse_array($buff, "<div id=\"navigation\">", "</div>");
	for($i=0; $i<count($div1); $i++)
	{
		$a = parse_array($div1[$i], "<a", "</a>");
		for($j=0; $j<count($a); $j++)
			if(stristr($a[$j],'javascript') === FALSE )
				$parsed .= $a[$j]."\n";
	}
	$parsed .= "<div>\n";
	fclose($fd);
	$fd = fopen($argv[1], "w");
	fwrite($fd,$parsed);
	fclose($fd);
?>

 comandi
Quali comandi!?
c'ho altri tag.
:-(
Manu

 e vedi se funzia.
ULP!
grazie!
vado a prendere gli occhiali: col redwiz mi avete dato i compiti per 
tutta la settimana...
;-)
Manu

 e vedi se funzia.
funziona, perň non modifica il file, produce solo output.
Come faccio per fargli modificare realmente il file?
Manu

 Quali comandi!?
un paio di preg_replace
#!/usr/bin/php
<?php
	function parse_array($string, $beg_tag, $close_tag)
	{
		preg_match_all("($beg_tag(.*)$close_tag)siU", $string, $matching_data);
		return $matching_data[0];
	}
	$parsed = "<div id=\"submenu\">\n";
	$fd = fopen($argv[1], "r");
	$buff = fread($fd, filesize($argv[1]));
	$div1 = parse_array($buff, "<div id=\"navigation\">", "</div>");
	for($i=0; $i<count($div1); $i++)
	{
		$a = parse_array($div1[$i], "<a", "</a>");
		for($j=0; $j<count($a); $j++)
			if(stristr($a[$j],'javascript') === FALSE )
				$parsed .= $a[$j]."\n";
	}
	$parsed .= "<div>\n";
	fclose($fd);
	$patt=array("(<div id=\"submenu\"(.*)</div>)siU","(<div id=\"navigation\"(.*)</div>)siU","(<script(.*)</script>)siU");
	$rep=array("",$parsed,"");
 
	$fd = fopen($argv[1], "w");
	fwrite($fd,preg_replace($patt, $rep, $buff));
	fclose($fd);
?>

 Come faccio per fargli modificare realmente il file?
Hai due possibilita': redirezione dell'output, ossia
sed -f programma.sed file.html > nuovofile.html
mv nuovofile.html file.html  
oppure usare l'opzione -i di sed:
sed -i.bak -f programma.sed file.html
quest'ultimo cambia direttamente file.html, salvando la versione precedente
in file.bak (utile per il ripristino se ci sono problemi, altrimenti si
puo' cancellare).

antani ha scritto:

ok.
grazie mille.
manu

 un paio di preg_replace
domani provo anche con questo, ma ci capisco meno che in quello 
suggerito da antani.
Manugrazie

 suggerito da antani.
forse ho capto male io quello che ti serviva, ma quell di antani funziona
solo in un caso particolare ciočche i link del primo div da spostare 
siano esattamente questi:
<a href="../gioielli.htm"><span>Italiano</span></a>
<a href="../jewels.htm"><span>English</span></a>
la mia soluzione sposta indistintamente *tutti* i link (che non vanno con
javascript) dal primo al secondo div, e cancella quello che rimane del
primo div.
la mia soluzione (forse erratamente) cancella tutto il javascriptpresente
anche in altre parti della pagina, se vuoi cancellare solo quello sotto a
quei div, va leggermente cambiata la preg_replace finale

 quei div, va leggermente cambiata la preg_replace finale
io volevo cancellare tutto il primo blocco e mettere due link nel 
secondo: nelle pagine attuali i link del secondo blocco appaiono solo se 
cliccati quelli javascript del primo blocco (e che fanno riferimento a 
submenu.js).
Comunque mi sono salvata il tutto e me lo riguardo con pazienza.
Manu

 secondo:
ed allora perchè metti la barretta verticale (come dire "ce ne
possono esssere N")tra i due link?
riporto cosa hai scritto:
<div id="submenu">
<a href="../gioielli.htm"><span>Italiano</span></a>
|
<a href="../jewels.htm"><span>English</span></a>
</div>

 sed -i.bak -f programma.sed file.html
magico!
in un secondo tutta la cartellata di file è come la volevo!
:-O
X

 </div>
mi rendo conto che ragioniamo con due basi diverse: la tua è quella 
tecnica di chi ci capisce, la mia è quella dell'ignorante semplice che 
vede il codice come segnettini bellini poco più.
La barretta, nella pagina html, mi appare in nero sulla striscia rossa 
del div e divide, appunto, i link... magari ci posso mettere / oppure ~ 
e ho comunque un segnettino separatore bellino.
Offendo la tua intelligenza?
:-(
X

 Offendo la tua intelligenza?
abbestia!