2011-08-25 18 views
6

Sto cercando di sostituire il contenuto di alcuni tag HTML in una pagina HTML usando sed in uno script bash. Per qualche motivo non sto ottenendo il risultato corretto in quanto non sostituisce nulla. Deve essere qualcosa di molto semplice/stupido che si affaccia, qualcuno si preoccupa di aiutarmi?Sostituzione del contenuto del tag HTML tramite sed

HTML alla ricerca/sostituisce in:

Unlocked <span id="unlockedCount"></span>/<span id="totalCount"></span> achievements for <span id="totalPoints"></span> points. 

comando sed usato:

cat index.html | sed -i -e "s/\<span id\=\"unlockedCount\"\>([0-9]\{0,\})\<\/span\>/${unlockedCount}/g" index.html 

Il punto di questo è di analizzare la pagina HTML e aggiornare i dati secondo alcuni dati esterni. Per una prima esecuzione, il contenuto dei tag sarà vuoto, dopo di che saranno riempiti.


EDIT:

ho finito per usare una combinazione delle risposte che ha portato alla seguente codice:

sed -i -e 's|<span id="unlockedCount">\([0-9]\{0,\}\)</span>|<span id="unlockedCount">'"${unlockedCount}"'</span>|g' index.html 

Molte grazie a @Sorpigal, @tripleee, @classic per l'aiuto!

+0

Questo è un uso inutile del gatto – Sorpigal

+0

ma cambia "cat" in f.e. "meno" non risolverà il mio problema ora vero? – Revell

+1

No, ma "sed" ... "file di input" sarà, ed è l'unico modo corretto di farlo se si vuole usare 'sed -i'. – tripleee

risposta

5

Prova questa:

sed -i -e "s/\(<span id=\"unlockedCount\">\)\(<\/span>\)/\1${unlockedCount}\2/g" index.html 
+1

Ciò non riuscirà dopo la prima volta. Devi abbinare '[0-9] \ {0, \}' tra i tag span. – Sorpigal

+0

Sì, se si suppone che sostituisca il valore nel tempo, è necessario correggere questo errore. – classic

1
sed -i -e 's%<span id="unlockedCount">([0-9]*)</span\>/'"${unlockedCount}/g" index.html 

ho tolto l'inutile Uso di Cat, tirò fuori un mazzo di backslash inutili, ha aggiunto virgolette singole intorno l'espressione regolare per proteggerlo da espansione della shell, e fissato l'operatore di ripetizione. Potrebbe ancora essere necessario eseguire il backslash delle parentesi di raggruppamento; il mio sed, almeno, vuole \ (... \).

Nota l'uso di virgolette singole e doppie una accanto all'altra. Le virgolette singole proteggono dall'espansione della shell, quindi non puoi usarle attorno a "$ {unlockedCount}" dove vuoi che la shell interpola la variabile.

1

Quello che dici che vuoi fare non è quello che stai dicendo sed fare.

Si desidera inserire un numero in un tag o sostituirlo se presente. Quello che stai cercando di dire a sed è di sostituire un tag span e il suo contenuto, se presente o numero, con il valore di in una variabile di shell.

Stai anche impiegando un sacco di sequenze di escape complesse, fastidiose ed inclini all'erorismo che non sono proprio necessarie.

Ecco ciò che si vuole:

sed -r -i -e 's|<span id="unlockedCount">([0-9]{0,})</span>|<span id="unlockedCount">'"${unlockedCount}"'</span>|g' index.html 

Nota le differenze:

  • Aggiunto -r per accendere espressioni prolungati senza la quale il vostro modello di acquisizione non avrebbe funzionato.
  • Utilizzare | anziché / come delimitatore per la sostituzione in modo che non sia necessario sfuggire a /.
  • L'espressione sed è stata citata in modo tale da non rendere necessario l'escape di elementi al suo interno dalla shell.
  • Incluso il tag span corrispondente nella sezione di sostituzione in modo che non venga eliminato.
  • Per espandere la variabile unlockedCount, è stata chiusa l'espressione a virgolette singole, quindi è stata riaperta in seguito.
  • Omesso cat | che era inutile qui.

Ho anche usato virgolette sull'espansione della variabile di shell, perché questa è una buona pratica, ma se non contiene spazi questo non è realmente necessario.

Non è stato necessario, in senso stretto, aggiungere -r. Semplice vecchio sed funzionerà se si dice \([0-9]\{0,\}\), ma l'idea qui era di semplificare.

+0

-r non sembra essere un comando sed valido? Almeno su Mac OS. – Revell

+1

In MacOS X l'opzione per abilitare le espressioni estese sarà diversa (probabilmente '-E', stile BSD). '-r' è un interruttore sed GNU. – Sorpigal

Problemi correlati