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

4

Estou criando um script de shell Bash para fazer alguma manipulação de arquivos em alguns arquivos HTML.

Entre as muitas ações que faço, tenho este comando sed 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 no diretório em questão e substitui uma linha de texto.

Eu queria fazer algo semelhante, onde substituo várias linhas entre dois comentários HTML.

Então, quero levar isso em consideração:

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

E altere para:

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

Eu encontrei este comando awk que parece funcionar quando eu o executo em um arquivo:

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

Então, pensei em fazer a mesma função find que uso com sed e aplicar esse método aqui para executar este comando awk em todos os arquivos 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 o executo, diz:

find: '-exec' no such parameter

Existe alguma maneira de eu conseguir que meu comando awk seja executado em todos os arquivos HTML?

Pergunta bônus: Posso também remover as duas tags em torno do texto que quero substituir? Por isso, <!-- STARTREPLACE1 --> e <!-- ENDREPLACE1 --> são removidos e só acabo com:

A whole new world!
    
por Questioner 02.04.2012 / 11:07

2 respostas

8

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

Em segundo lugar, awk não modifica o arquivo como sed do (com a opção -i ), portanto, você deve enviar a saída para um arquivo temporário e movê-lo para o arquivo original.

Crie um script (digamos que chamamos 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"

atribua permissões executáveis

chmod +x ./replace

execute

find "$DIR" -type f -iname '*.html' -exec ./replace {} \;
    
por 02.04.2012 / 11:19
2

E para o bônus:

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

Tags