Pagina 1 di 1
aiuto con sed
Inviato: mer 25 giu 2008, 16:47
da aghnosci
Ciao a tutti,
ho un problemino che vorre risolvere con sed ma non riesco:
devo fare alcune sostituzioni in un file html che contiene alcune righe in php. Il problema è che il pattern che che cerco può trovarsi sia nell'html che nel php e devo sostituirlo solo nell'html. Faccio un esempio per spiegarmi meglio
file html:
...
<body>
<p>hello</p>
<?=$hellofriends ?>
....
se volessi sostituire hello con ciao nella parte html senza sostituirlo nalle parte php come potrei usare sed? oppure ci sono strumenti migliori?
(i tag di apertura del php possono variare; ho fatto diverse prove con espressioni regolari ma non sono venuto a capo)
ogni consiglio sarà molto apprezzato
Re: aiuto con sed
Inviato: mer 25 giu 2008, 21:06
da anycolouryoulike
Di HTML e PHP non so niente, però da quello che ho capito inizia sempre con un tag <html> che può avere parametri e finisce con un <html/>. Prova tanto sed ti fa il backup:
Codice: Seleziona tutto
sed -ie '/<html\( [^>]\+\)*>/,/<html\/>/s/nome/sostituto/g' nomefile
Re: aiuto con sed
Inviato: gio 26 giu 2008, 17:21
da aghnosci
Grazie anycolouryoulike,
anche se non risolutivo sono partito dal tuo suggerimento e ho risolto così:
sed -e '/\(<\?\).*\$.*\(\?>\)/!s/>find</>replace</g' file
che poi in realtà è stato suffciente così:
sed -e 's/>find</>replace</g' file
(ma dopo del lavoro preliminare di scrematura
Re: aiuto con sed
Inviato: gio 26 giu 2008, 17:53
da targzeta
Ma tu vuoi proteggere tutto ciò che è compreso tra <? e ?> ?
Spina
Re: aiuto con sed
Inviato: gio 26 giu 2008, 22:35
da anycolouryoulike
Credo di si...
Secondo me non è possibile.
Re: aiuto con sed
Inviato: gio 26 giu 2008, 22:53
da targzeta
anycolouryoulike ha scritto:Credo di si...
Secondo me non è possibile.
Bhé, in linea di massima niente è impossibile, ma prima di mettermi giù a pensare, mi piacerebbe capire quanto interessa ad aghnosci risolvere il suo problema

.
Spina
Re: aiuto con sed
Inviato: gio 26 giu 2008, 23:01
da anycolouryoulike
Io l'ho presa come una sfida.
Ci sto pensando ma mi sembra proprio impossibile, almeno con sed.
Re: aiuto con sed
Inviato: gio 26 giu 2008, 23:10
da anycolouryoulike
Impossibile, sicuramente.
Non è possibile escludere dei pattern dalla sostituzione, solo linee.
Re: aiuto con sed
Inviato: gio 26 giu 2008, 23:13
da targzeta
anycolouryoulike ha scritto:Impossibile, sicuramente.
Non è possibile escludere dei pattern dalla sostituzione, solo linee.

, e se ti dicessi è possibile?
Spina
Re: aiuto con sed
Inviato: gio 26 giu 2008, 23:23
da anycolouryoulike
Ma veramente? Con un solo comando?
Allora le possibilità sono due: o hai trovato un comando che non è scritto neanche nella man page oppure hai scritto una espressione regolare veramente perversa.
Se è la prima puoi anche dirlo, se è la seconda continuo a pensarci.
Re: aiuto con sed
Inviato: gio 26 giu 2008, 23:25
da targzeta
anycolouryoulike ha scritto:Ma veramente? Con un solo comando?
Allora le possibilità sono due: o hai trovato un comando che non è scritto neanche nella man page oppure hai scritto una espressione regolare veramente perversa.
Se è la prima puoi anche dirlo, se è la seconda continuo a pensarci.
Si fa con sed e i comandi sono tutti nella man page, ma ancora non ci sono arrivato neanche io, dammi qualche minuto. Accidenti, hai invogliato anche me

.
Spina
Re: aiuto con sed
Inviato: gio 26 giu 2008, 23:31
da targzeta
Ecco qui, tutto quello che è tra '<?' e '?>' viene preservato.
File casa.txt
Codice: Seleziona tutto
<body>
<p>hello</p>
<?=$hellofriends ?>
<? hello
salut hello
casa hello
?>
hello
casa
Comando:
Codice: Seleziona tutto
sed -n '/<?.*?>/{p;d};/<?/{p;b skip};s/hello/CIAO/g;p;d;:skip n;/?>/{p;d};p;b skip;' casa.txt
Spina
P.S. Forse si può anche migliorare, ma non ci ho pensato molto.
Re: aiuto con sed
Inviato: gio 26 giu 2008, 23:50
da anycolouryoulike
Io ci stavo provando con s///g...
Che sono i ; e :skip n?
Domani forse lo capirò
Re: aiuto con sed
Inviato: ven 27 giu 2008, 0:14
da targzeta
Forse hai ragione, è un pò troppo criptico.
File casa.txt
Codice: Seleziona tutto
<body>
<p>hello</p>
<?=$hellofriends ?>
<? hello
salut hello
casa hello
?>
hello
casa
file sed.script
Codice: Seleziona tutto
# Stampo (preservo dal comando s) tutte le righe che hanno <? e ?>
/<?.*?>/{
p; # Stampo la riga
d; # Passo alla riga successiva (ricomincia il ciclo)
}
# Se incontro un <?
/<?/{
p; # Stampo la riga (la preservo dal comando s)
b skip; # GOTO etichetta skip
}
# Se nessuna delle due espressioni regolari ha matchato sulla riga corrente
s/hello/CIAO/g; # Faccio la sostituzione
p; # Stampo la riga
d; # Passo alla riga successiva (ricomincia il ciclo)
# Etichetta skip, stampo (preservo) tutte le righe sino a che non incontro un '?>'
:skip
n; # Leggo la riga successiva
# La riga ha un '?>'
/?>/{
p; # Stampo la riga
d; # Passo alla riga successiva (ricomincio il ciclo)
}
# Non aveva un '?>'
p; # Stampo la riga
b skip; # GOTO etichetta skip
Comando:
Output:
Codice: Seleziona tutto
<body>
<p>CIAO</p>
<?=$hellofriends ?>
<? hello
<? hello
salut hello
salut hello
casa hello
casa hello
?>
CIAO
casa
Spero ti possa aiutare a capire

. E spero anche che sia utile all'autore del thread.
Spina
Re: aiuto con sed
Inviato: ven 27 giu 2008, 14:50
da anycolouryoulike
Rincomincia il ciclo sarebbe rincomincia lo script dall'inizio usando la riga successiva? Cioé d?
Invece n passa alla riga successiva senza tornare all'inizio dello script?
Comunque per imparare il man non serve più di tanto, è troppo astratto.
Molto meglio info sed.
E se mettessi un tag HTML tra due tag PHP nella stessa linea?
Ci vorrebbe un espressione regolare che verifichi tutto tranne una parola (?>), contando (non se se è possibile) che all'interno del tag PHP potrebbe esserci anche un ? non seguito da un >.
Questo è impossibile veramente, forse un limite delle espressioni regolari.