[Risolto]problemi con sed e stringhe lunghe con apici

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
ale_p
Prode Principiante
Messaggi: 23
Iscrizione: mercoledì 25 febbraio 2015, 15:42
Sesso: Maschile

[Risolto]problemi con sed e stringhe lunghe con apici

Messaggio da ale_p »

Buonasera forum, come da titolo sto avendo dei problemi nel rimpiazzamento di una stringa con una relativamente lunga (spezzone di codice JavaScript) e contenente degli apici singoli. Sto infatti cercando di inserire il seguente codice JS

Codice: Seleziona tutto

<script src="funcfolder.js"></script>
<script>
  document.addEventListener('DOMContentLoaded', function(event) {
    firstfunction.showbar('message',  'acceptmsg', 'learnmoremsg', 'link');
  });
</script>
in tutte le pagine del sito che gestisco. Ovviamente la modifica diretta di ciascuna pagina sarebbe un'operazione lunga e noiosa, quindi stavo cercando di automatizzare il tutto con una shell. Avendo già usato la funzione sed altre volte per questo scopo (con stringhe più brevi e "semplici" però) stavo provando a seguire lo stesso approcio e dato che lo spezzone JS va inserito sopra al tag </body>, l'idea era proprio di sostituire tale parte con lo script e concludere anch'esso con </body> in modo da non eliminarlo ma usarlo solo come "segnaposto" del punto di inserimento. Il problema sta negli apici singoli presenti nella stringa da inserire, che mi mandano in panico la sed, che o non riesce a concludere il suo lavoro dicendomi che il comando "s" non è terminato, oppure non fa niente.
la sintassi che uso è

Codice: Seleziona tutto

sed -i "s|$oldstring|$newstring|g" nomefile
mettendo </body> in oldstring ed il codice in newstring
ho provato a fare l'escape degli apici con backslash ma non cambia nulla, sto sbagliando qualcosa ma ho fatto varie prove e non riesco a capire dove... voi che metodo usate per un rimpiazzamento così corposo? avete qualcosa da suggerirmi? Grazie a tutti e buona giornata!
Ultima modifica di ale_p il mercoledì 8 luglio 2015, 12:20, modificato 1 volta in totale.
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: problemi con sed e stringhe lunghe con apici

Messaggio da crap0101 »

penso sia per i newline, se provi con

Codice: Seleziona tutto

sed -i "s|$old|$(echo $new)|" FILE
funziona, o anche inserendo "brutalmente" il testo da sostituire al posto di $new

Codice: Seleziona tutto

sed -i "s|</body>|<script src=funcfolder.js></script> <script> document.addEventListener('DOMContentLoaded', function(event) { firstfunction.showbar('message', 'acceptmsg', 'learnmoremsg', 'link'); }); </script>|" FILE
.... oppure fai l'escape dei newline

Codice: Seleziona tutto

crap0101@orange:/tmp/foo$ new="<script src="funcfolder.js"></script>\
<script>\
  document.addEventListener('DOMContentLoaded', function(event) {\
    firstfunction.showbar('message',  'acceptmsg', 'learnmoremsg', 'link');\
  });\
</script>"
crap0101@orange:/tmp/foo$ cat x.html 
xxx
<body>
yyy
</body>
zzz
crap0101@orange:/tmp/foo$ sed  "s|</body>|$new|" x.html 
xxx
<body>
yyy
<script src=funcfolder.js></script><script>  document.addEventListener('DOMContentLoaded', function(event) {    firstfunction.showbar('message',  'acceptmsg', 'learnmoremsg', 'link');  });</script>
zzz
crap0101@orange:/tmp/foo$
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
ale_p
Prode Principiante
Messaggi: 23
Iscrizione: mercoledì 25 febbraio 2015, 15:42
Sesso: Maschile

Re: problemi con sed e stringhe lunghe con apici

Messaggio da ale_p »

la prima soluzione che mi hai dato funziona... quasi :D nel senso che in message ci devo scrivere "l\'esperienza" e deve rimanere il backslash perchè poi è nella funzione e sennò mi si chiude lì la stringa. Speravo io bastasse fare l'escape del backslash tipo "l\\'esperienza) ma non va, mi viene comunque scritto "l'esperienza" con chiusura della stringa passata alla funzione JavaScript all'apostrofo mannaggia.. in più "à" mi viene A con l'accento...
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: problemi con sed e stringhe lunghe con apici

Messaggio da crap0101 »

quando ci sono caratteri "speciali" di cui bisogna fare l'escape e, soprattutto, se il testo in questione passa per un tot di programmi differenti, con regole e interpretazioni differenti diventa effettivamente un casino ed aumentano le possibilità di errori.
Se non ti è scomodo, valuta di fare uno script direttamente con sed senza usare echo o altro, una cosa così:

Codice: Seleziona tutto

crap0101@orange:/tmp/foo$ cat x.html 
xxx
<body>
yyy
</body>
zzz
crap0101@orange:/tmp/foo$ cat foo.sed
s|</body>|<script src=funcfolder.js>\
    </script><script>\
    document.addEventListener(\
        'DOMContentLoaded',\
        function(event) {\
            firstfunction.showbar(\
                "l'esperienza ààà", 'acceptmsg', 'learnmoremsg', 'link');\
      }); </script>|
crap0101@orange:/tmp/foo$ sed -f foo.sed x.html 
xxx
<body>
yyy
<script src=funcfolder.js>
    </script><script>
    document.addEventListener(
        'DOMContentLoaded',
        function(event) {
            firstfunction.showbar(
                "l'esperienza ààà", 'acceptmsg', 'learnmoremsg', 'link');
      }); </script>
zzz
che dovrebbe risolverti il problema degli apici (singoli, doppi e che altro) annidati... e penso anche il problema delle accentate di cui parli.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
ale_p
Prode Principiante
Messaggi: 23
Iscrizione: mercoledì 25 febbraio 2015, 15:42
Sesso: Maschile

Re: problemi con sed e stringhe lunghe con apici

Messaggio da ale_p »

Mi scuso intanto per l'errore di sezione, non avevo visto che programmazione c'era (e mi sembrava strano). Ci siamo ma mi continua a dare l'errore della à... che però potrei risolvere cambiando frase :D poco elegante ma efficace; peccato solo che però mi perde l'impaginazione e si sa che nel codice ciò può infastidire. A questo punto la domanda diventa più di gestione che di programmazione vera... Voi come fate se dovete modificare delle decine di file di codice, modificando in ognuno la stessa parte con una sempre uguale, e magari mantenendo anche l'impaginazione, come ritorni a capo, inserimento di stringhe come stringhe (quindi mantenendo gli apici) ecc... insomma non credo che chi, come me, abbia la necessità di modificare tutte le pagine di un sito con la stessa cosa lo faccia a mano, una per una :P

edit: Se mi do dell'ebete da solo mi bannano? :muro:
quando le cose si fanno di fretta... comunque sono rimasto ad impazzire per niente, caricando lo stesso JavaScript in tutte le pagine... posso metterle lì le stringhe message eccetera! è anche più comodo, se mai vorrò cambiarle lo faccio in un singolo script e finita lì! Poi nella funzione che va in tutte le pagine html ci metto le variabili, niente apici, niente dolori :D comunque, visto che non sarà l'ultima volta che mi toccano corpose modifiche (chi lo gestiva prima ha pensato bene di mettere tutta la formattazione nel codice html, niente CSS ed ora è improponibile metterci mano ma prima o poi mi toccherà) vi va di condividere i vostri trucchetti per invelocizzare i lavori, come dicevo prima magari mantenendo tabulazioni, ritorni a capo eccetera? Per esempio adesso, usando lo script discusso sopra, mi viene tutto ma ho, alla fine della funzione (stessa riga) i tag </script> </body> e mi piacerebbe riuscire a farli comparire nel foglio html come
</script>
</body>
ed ho notato che non basta un newline...
Ho inoltre notato che il problema della à rimane, anche se ora quella lettera non "passa" più per la sed. Può quindi essere un errore di codifica di Ubuntu/tastiera impazzita? Perchè mi pare strano che se nello script scrivo à dal notepad++ di win (altro PC) mi viene à e se invece la scrivo dal gedit mi viene maiuscola e con l'accento!
Avete qualche idea su cosa può essere?

Ok, la à è un carattere speciale e mettendoci il codice viene bene
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: problemi con sed e stringhe lunghe con apici

Messaggio da crap0101 »

se usi il codice come del mio ultimo esempio la formattazione non è un problema (nel senso, se si conosce già prima com'è l'indentazione e a meno di non dover indentare in modo specifico da file a file), per le accentate penso dipenda dal'encoding diverso dei file con cui lavori, una cosa tipo utf-8 vs iso8859 o peggio cp-1252
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
ale_p
Prode Principiante
Messaggi: 23
Iscrizione: mercoledì 25 febbraio 2015, 15:42
Sesso: Maschile

Re: [Risolto]problemi con sed e stringhe lunghe con apici

Messaggio da ale_p »

Vero, ho avuto un attimo per leggere il manuale della sed ed ho capito che passaggio hai fatto, non avevo intuito bene all'inizio, mi sembrava fosse solo un rimpiazzamento della variabile newstring con il suo valore! Così è tutto più comodo. per le lettere con l'accento penso anche io sia la codifica dei caratteri, ma come faccio quando uso l'html, anche nel JavaScript ritengo sia meglio usare il codice onde evitare visualizzazioni strane. Non ero a conoscenza del fatto che i codici fossero diversi tra html e JS. Grazie ancora!
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti