Por que esse comando awk não funciona tão bem com find quanto sed?

Por que esse comando awk não funciona tão bem com find quanto sed?

Estou criando umScript de shell Bashpara fazer alguma manipulação de arquivos em alguns arquivos HTML.

Entre as muitas ações que faço, tenho este sedcomando que funciona muito bem:

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' {} \;

Ele examina todos os arquivos HTML do diretório em questão e substitui uma linha de texto.

Eu queria fazer algo semelhante onde substituísse várias linhas entre dois comentários HTML.

Então eu quero pegar isso:

<!-- STARTREPLACE1 -->
Blah
Blah
Blah
<!-- ENDREPLACE1 -->

E mude para:

<!-- STARTREPLACE1 -->
A whole new world!
<!-- ENDREPLACE1 -->

Encontrei este awkcomando que parece funcionar quando o executo em um arquivo:

awk '/<!-- STARTREPLACE1 -->/{p=1;print;print "A whole new world!"}/<!-- ENDREPLACE1 -->/{p=0}!p' justonefile.html

Então pensei que poderia fazer a mesma findfunção que uso sede aplicar esse método aqui para executar este awkcomando em cada arquivo HTML no diretório:

find $DIR -type f -name '*.html' -exec awk '/<!-- STARTREPLACE1 -->/{p=1;print;print "A whole new world!"}/<!-- ENDREPLACE1 -->/{p=0}!p'

Mas quando eu executo ele diz:

find: `-exec' no such parameter

Existe uma maneira de executar meu comando awk em todos os arquivos HTML?

Pergunta bônus:Também posso remover as duas tags ao redor do texto que desejo substituir? Então <!-- STARTREPLACE1 -->e <!-- ENDREPLACE1 -->são removidos e eu só acabo com:

A whole new world!

Responder1

Primeiro de tudo, você precisa encerrar a -execação com {} \;.

Segundo, awknão modifique o arquivo no local como sedfaz (com a -iopção); portanto, você deve enviar a saída para um arquivo temporário e, em seguida, movê-lo para o arquivo original.

Crie um script (digamos que o chamamos de replace) com o seguinte conteúdo:

#!/bin/sh
tfile=$(mktemp)
awk '/<!-- STARTREPLACE1 -->/{p=1;print;print "A whole new world!"} 
     /<!-- ENDREPLACE1 -->/  {p=0}' "$1" >"$tfile" && \
  mv "$tfile" "$1"

dê permissões executáveis

chmod +x ./replace

então corra

find "$DIR" -type f -iname '*.html' -exec ./replace {} \;

Responder2

E para o bônus:

gawk '{!p} /<!-- STARTREPLACE1 -->/{print "A whole new world!";p=1}/<!-- ENDREPLACE1 -->/{p=0}'

informação relacionada