Vae, son tornato da un matrimonio e ho visto la tua risposta... non mi puoi fare così, ora mi incuriosisci con quella sintassi dei '< <'.
Comunque mi si complicherebbe il codice, cambiando il separatore ho già tutto funzionante.
Nella struttura di prova ho sbagliato ad inserire il codice dello spazio, ho messo '20%' invece di '%20' pensavo all'iva al 20% : ). Ora nel link alla struttura di prova ho messo i file corretti.
Cerco di spiegarti meglio quello che vorrei fare.
Situazione di origine:
Ho tante pagine html con links ad altre pagine e ad immagini di cui ti faccio un esempio:
Codice: Seleziona tutto
bla bla guarda <a href="IndirIzzo Della Pagina.htm">questa</a>
bla bla guarda <a href="IndirIzzo%20Di%20Pagina%20Diversa.htm">quest'altra</a>
bla bla <img src="Immagine di Qualcosa.JpG">
e i file a cui si riferiscono i links sono:
Codice: Seleziona tutto
IndirIzzo Della Pagina.htm
IndirIzzo Di Pagina Diversa.htm
Immagine di Qualcosa.JpG
Situazione da ottenere:
Nomi ed estensioni dei file devono essere minuscoli e senza spazi, per quello vanno sostituiti gli spazi con gli underscore.
Gli indirizzi nei links devono coincidere con i nomi dei file corretti
quindi anche loro minuscoli e con gli spazi sostituiti da underscore
Codice: Seleziona tutto
bla bla guarda <a href="indirizzo_della_pagina.htm">questa</a>
bla bla guarda <a href="indirizzo_di_pagina_diversa.htm">quest'altra</a>
bla bla <img src="immagine_di_qualcosa.jpg">
i file a cui si riferiranno i links sono:
Codice: Seleziona tutto
indirizzo_della_pagina.htm
indirizzo_di_pagina_diversa.htm
immagine_di_qualcosa.jpg
Ho scritto il codice per rinominare in modo corretto tutti i files
Ho scritto il codice per avere in un array tutti i "vecchi nomi di file" e in un'altro array tutti i "nuovi_nomi_di_file_corretti".
In entrambi gli array, gli indirizzi sono ordinati e resi unici.
Ho già fatto un controllo per verificare che non siano stati eliminati file (eventualmente diventati con nome uguale dopo la rinomina).
Ora, a 'vecchi_file[0]' corrisponde 'nuovi_file[0]' e così via, per esempio (non guardare la sintassi):
Codice: Seleziona tutto
vecchi_file[0]=IndirIzzo Della Pagina.htm
nuovi_file[0]=indirizzo_della_pagina.htm
Avevo intenzione di fare la sostituzione con sed ciclando un array e mettendo nei campi di sostituzione:
Codice: Seleziona tutto
s/vecchi_file[$i]/nuovi_file[$i]/g # sintassi semplificata per l'esempio
Poi mi era venuto in mente di trovare un modo per fare la sostituzione sui file html sfruttando la regex:
Codice: Seleziona tutto
grep -ioP '<(a href)?(img.*?src)?="\K(.*?)(?=".*?>)' pag.htm
che mi manda in output gli indirizzi presenti nei tag '<a href"*"...>' e nei tag <img src="*"...> (prendo solo quanto indicato con '*')
Fatta questa e visti i risultati ho trovato alcuni spazi nei links codificati (giustamente) con '%20'
così sono entrato in confusione, la sostituzione mediante array non avrebbe più funzionato.
In realtà basterebbe fare prima la sostituzione di '%20' con '_' e il procedimento dovrebbe funzionare ugualmente, una cosa di questo genere:
Codice: Seleziona tutto
find $path -iname "*.htm" -exec sed 's/%20/ /g' {} \; # edit lo spazio non l'underscore
Non ho ancora deciso che metodo usare.
Abbi pazienza per il lungo post, spero si sia capito quello che vorrei fare.