estoy creando unscript de shell bashpara realizar alguna manipulación de archivos en algunos archivos HTML.
Entre las muchas acciones que hago, tengo este sed
comando que funciona muy bien:
find $DIR -type f -name '*.html' -exec sed -i 's/.*<script type="text\/javascript" charset="utf-8" src="file.js"><\/script>.*/<script type="text\/javascript" charset="utf-8" src="file2.js"><\/script>/g' {} \;
Examina todos los archivos HTML del directorio en cuestión y reemplaza una línea de texto.
Quería hacer algo similar donde reemplazo varias líneas entre dos comentarios HTML.
Entonces quiero tomar esto:
<!-- STARTREPLACE1 -->
Blah
Blah
Blah
<!-- ENDREPLACE1 -->
Y cámbielo a:
<!-- STARTREPLACE1 -->
A whole new world!
<!-- ENDREPLACE1 -->
Encontré este awk
comando que parece funcionar cuando lo ejecuto en un archivo:
awk '/<!-- STARTREPLACE1 -->/{p=1;print;print "A whole new world!"}/<!-- ENDREPLACE1 -->/{p=0}!p' justonefile.html
Entonces pensé que podría hacer la misma find
función que uso sed
y aplicar ese método aquí para ejecutar este awk
comando en cada archivo HTML en el directorio:
find $DIR -type f -name '*.html' -exec awk '/<!-- STARTREPLACE1 -->/{p=1;print;print "A whole new world!"}/<!-- ENDREPLACE1 -->/{p=0}!p'
Pero cuando lo ejecuto me dice:
find: `-exec' no such parameter
¿Hay alguna manera de ejecutar mi comando awk en todos los archivos HTML?
Pregunta extra:¿Puedo también eliminar las dos etiquetas alrededor del texto que quiero reemplazar? Entonces <!-- STARTREPLACE1 -->
y <!-- ENDREPLACE1 -->
se eliminan y solo termino con:
A whole new world!
Respuesta1
En primer lugar, debes finalizar la -exec
acción con {} \;
.
En segundo lugar, awk
no modifique el archivo en su lugar como sed
lo hace (con la -i
opción), por lo que debe enviar el resultado a un archivo temporal y luego moverlo al archivo original.
Cree un script (digamos que lo llamamos replace
) con el siguiente contenido:
#!/bin/sh
tfile=$(mktemp)
awk '/<!-- STARTREPLACE1 -->/{p=1;print;print "A whole new world!"}
/<!-- ENDREPLACE1 -->/ {p=0}' "$1" >"$tfile" && \
mv "$tfile" "$1"
darle permisos ejecutables
chmod +x ./replace
entonces corre
find "$DIR" -type f -iname '*.html' -exec ./replace {} \;
Respuesta2
Y para el bono:
gawk '{!p} /<!-- STARTREPLACE1 -->/{print "A whole new world!";p=1}/<!-- ENDREPLACE1 -->/{p=0}'