2011-08-25 12 views
6

Estoy tratando de reemplazar el contenido de algunas etiquetas HTML en una página HTML usando sed en un script bash. Por alguna razón, no estoy obteniendo el resultado correcto, ya que no está reemplazando nada. Tiene que ser algo muy simple/estúpido, ¿alguien se preocupa por ayudarme?Reemplazando el contenido de la etiqueta HTML usando sed

HTML para buscar/reemplazar en:

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

comando sed utilizado:

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

El punto de esto es para analizar la página HTML y actualizar las cifras de acuerdo con algunos datos externos. Para una primera ejecución, el contenido de las etiquetas estará vacío, después de eso se llenarán.


EDIT:

Terminé usando una combinación de las respuestas que dieron como resultado el siguiente código:

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

Muchas gracias a @Sorpigal, @tripleee, para @classic ¡la ayuda!

+0

Este es un uso inútil del gato – Sorpigal

+0

pero cambiando "cat" a f.e. "menos" realmente no resolverá mi problema ahora, ¿o sí? – Revell

+1

No, pero 'sed '...' inputfile' lo hará, y es la única forma correcta de hacerlo si quiere usar' sed -i'. – tripleee

Respuesta

5

Prueba esto:

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

Esto fallará después de la primera vez. Necesitas hacer coincidir '[0-9] \ {0, \}' entre las etiquetas span. – Sorpigal

+0

Sí, si se supone que debe reemplazar el valor en el lapso de esta necesidad de ser corregido – classic

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

Quité el uso inútil de gato, sacó un manojo de barras invertidas innecesarios, añade comillas simples alrededor de la expresión regular para protegerlo de expansión cáscara, y se fija el operador repetición. Es posible que aún deba hacer una barra diagonal inversa en el paréntesis de agrupación; mi sed, al menos, quiere \ (... \).

Tenga en cuenta el uso de comillas simples y dobles al lado de la otra. Las comillas simples protegen contra la expansión del shell, por lo que no puede utilizarlas en "$ {unlockedCount}" donde desea que el shell interpole la variable.

1

Lo que usted dice que quiere hacer no es lo que estás diciendo sed hacer.

Desea insertar un número en una etiqueta o reemplazarla si está presente. Lo que está tratando de decir sed es reemplazar una etiqueta span y su contenido, si corresponde o un número, con el valor de en una variable de shell.

También está empleando una gran cantidad de secuencias de escape complejas, molestas y propensas al eror que simplemente no son necesarias.

Aquí es lo que quiere:

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

observar las diferencias:

  • Agregado -r para encender expresiones prolongados sin la cual su patrón de captura no funcionaría.
  • Se usó | en lugar de / como el delimitador para la sustitución, por lo que no sería necesario el escape /.
  • Cita simple de la expresión sed para que no sea necesario escapar de su caparazón.
  • Incluyó la etiqueta de span coincidente en la sección de reemplazo para que no se elimine.
  • Para expandir la variable unlockedCount, cerró la expresión entre comillas simples, y luego la volvió a abrir.
  • Omitido cat | que era inútil aquí.

También utilicé comillas dobles para la expansión de la variable del intérprete de órdenes, porque esta es una buena práctica, pero si no contiene espacios, esto no es realmente necesario.

No era necesario, en sentido estricto, agregar -r. El antiguo sed funcionará si dices \([0-9]\{0,\}\), pero la idea aquí fue simplificar.

+0

-r no parece ser un comando sed válido? En Mac OS al menos. – Revell

+1

En MacOS X, el cambio para habilitar expresiones extendidas será diferente (probablemente ''E', estilo BSD). '-r' es un interruptor de sedimentación GNU. – Sorpigal

Cuestiones relacionadas