¿Por qué este comando awk no funciona tan bien con find como lo hace sed?

¿Por qué este comando awk no funciona tan bien con find como lo hace sed?

estoy creando unscript de shell bashpara realizar alguna manipulación de archivos en algunos archivos HTML.

Entre las muchas acciones que hago, tengo este sedcomando 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 awkcomando 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 findfunción que uso sedy aplicar ese método aquí para ejecutar este awkcomando 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 -execacción con {} \;.

En segundo lugar, awkno modifique el archivo en su lugar como sedlo hace (con la -iopció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}'

información relacionada