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 sed
comando 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 awk
comando 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 find
função que uso sed
e aplicar esse método aqui para executar este awk
comando 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 -exec
ação com {} \;
.
Segundo, awk
não modifique o arquivo no local como sed
faz (com a -i
opçã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}'