Warum funktioniert dieser awk-Befehl nicht so gut mit find wie sed?

Warum funktioniert dieser awk-Befehl nicht so gut mit find wie sed?

Ich erstelle einBash-Shell-Skriptum einige Dateimanipulationen an einigen HTML-Dateien vorzunehmen.

Unter den vielen Aktionen, die ich ausführe, gibt es diesen sedBefehl, der hervorragend funktioniert:

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

Es durchsucht jede HTML-Datei im betreffenden Verzeichnis und ersetzt eine Textzeile.

Ich wollte etwas Ähnliches machen, indem ich mehrere Zeilen zwischen zwei HTML-Kommentaren ersetze.

Also ich möchte das hier nehmen:

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

Und ändern Sie es in:

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

Ich habe diesen awkBefehl gefunden, der zu funktionieren scheint, wenn ich ihn auf einer Datei ausführe:

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

Daher dachte ich, ich könnte dieselbe findFunktion, die ich verwende, verwenden sedund diese Methode hier anwenden, um diesen awkBefehl für jede HTML-Datei im Verzeichnis auszuführen:

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

Aber wenn ich es ausführe, heißt es:

find: `-exec' no such parameter

Gibt es eine Möglichkeit, meinen awk-Befehl für alle HTML-Dateien auszuführen?

Bonus-Frage:Kann ich auch die beiden Tags um den Text entfernen, den ich ersetzen möchte? Also werden <!-- STARTREPLACE1 -->und <!-- ENDREPLACE1 -->entfernt und ich erhalte am Ende nur:

A whole new world!

Antwort1

Zunächst müssen Sie die -execAktion mit beenden {} \;.

Zweitens: awkÄndern Sie die Datei nicht an Ort und Stelle, wie seddies (mit der -iOption) der Fall ist. Senden Sie die Ausgabe daher an eine temporäre Datei und verschieben Sie diese dann in die Originaldatei.

Erstellen Sie ein Skript (sagen wir, wir nennen es replace) mit dem folgenden Inhalt:

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

Geben Sie ihm Ausführungsberechtigungen

chmod +x ./replace

dann renne

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

Antwort2

Und als Bonus:

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

verwandte Informationen