Я создаюСкрипт оболочки 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}'