Ich erstelle einBash-Shell-Skriptum einige Dateimanipulationen an einigen HTML-Dateien vorzunehmen.
Unter den vielen Aktionen, die ich ausführe, gibt es diesen sed
Befehl, 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 awk
Befehl 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 find
Funktion, die ich verwende, verwenden sed
und diese Methode hier anwenden, um diesen awk
Befehl 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 -exec
Aktion mit beenden {} \;
.
Zweitens: awk
Ändern Sie die Datei nicht an Ort und Stelle, wie sed
dies (mit der -i
Option) 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}'