Почему эта команда awk не так хорошо работает с find, как sed?

Почему эта команда awk не так хорошо работает с find, как sed?

Я создаюСкрипт оболочки Bashдля выполнения некоторых манипуляций с некоторыми файлами HTML.

Среди множества действий, которые я выполняю, есть sedкоманда, которая работает отлично:

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

Он просматривает каждый HTML-файл в соответствующем каталоге и заменяет одну строку текста.

Я хотел сделать что-то подобное, заменив несколько строк между двумя HTML-комментариями.

Итак, я хочу взять это:

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

И измените его на:

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

Я нашел эту awkкоманду, которая, кажется, работает, если запустить ее для одного файла:

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

Поэтому я подумал, что могу использовать ту же findфункцию, которую я использую, sedи применить этот метод здесь, чтобы выполнить эту awkкоманду для каждого HTML-файла в каталоге:

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

Но когда я его запускаю, он говорит:

find: `-exec' no such parameter

Есть ли способ заставить команду awk выполняться для всех HTML-файлов?

Бонусный вопрос:Могу ли я также удалить два тега вокруг текста, который я хочу заменить? Поэтому <!-- STARTREPLACE1 -->и <!-- ENDREPLACE1 -->удаляются, и в итоге у меня остается только:

A whole new world!

решение1

Прежде всего, вам необходимо завершить -execдействие с помощью {} \;.

Во-вторых, awkне изменяйте файл на месте, как sedэто делается (с -iопцией ), поэтому вам следует отправить вывод во временный файл, а затем переместить его в исходный файл.

Создайте скрипт (допустим, назовем его replace) со следующим содержанием:

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

дайте ему права на исполнение

chmod +x ./replace

затем беги

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

решение2

И бонус:

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

Связанный контент