aiuto con sed

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
aghnosci
Linux 0.x
Linux 0.x
Messaggi: 88
Iscritto il: lun 13 set 2004, 0:00

aiuto con sed

Messaggio 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

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: aiuto con sed

Messaggio 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

aghnosci
Linux 0.x
Linux 0.x
Messaggi: 88
Iscritto il: lun 13 set 2004, 0:00

Re: aiuto con sed

Messaggio 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

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: aiuto con sed

Messaggio da targzeta »

Ma tu vuoi proteggere tutto ciò che è compreso tra <? e ?> ?

Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: aiuto con sed

Messaggio da anycolouryoulike »

Credo di si...
Secondo me non è possibile.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: aiuto con sed

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: aiuto con sed

Messaggio da anycolouryoulike »

Io l'ho presa come una sfida.
Ci sto pensando ma mi sembra proprio impossibile, almeno con sed.

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: aiuto con sed

Messaggio da anycolouryoulike »

Impossibile, sicuramente.
Non è possibile escludere dei pattern dalla sostituzione, solo linee.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: aiuto con sed

Messaggio da targzeta »

anycolouryoulike ha scritto:Impossibile, sicuramente.
Non è possibile escludere dei pattern dalla sostituzione, solo linee.
:lol:, e se ti dicessi è possibile?

Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: aiuto con sed

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

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: aiuto con sed

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: aiuto con sed

Messaggio 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.
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: aiuto con sed

Messaggio da anycolouryoulike »

Io ci stavo provando con s///g...
Che sono i ; e :skip n?
Domani forse lo capirò

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: aiuto con sed

Messaggio 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:

Codice: Seleziona tutto

sed -f sed.script casa.txt
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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: aiuto con sed

Messaggio 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? :badgrin:
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.

Rispondi