Предполагая, что все разделенные файлы имеют одинаковое имя, вы можете использовать. Нет необходимости в петле.
LINE_TO_INSERT=$(head -1 originalFile)
sed -i "1s/^/${LINE_TO_INSERT/\\/\\\\}\n/" segment??
Решение с awk
может быть следующим:
awk '/Analytics code start/ { t=1; print; system("cat myanalytics.txt") }
/Analytics code end/ { t=0 }
t==0 { print } ' index.html
(Я сделал отступ в коде, чтобы повысить удобочитаемость, но он легко может быть однострочным)
Вкратце объяснение:
t == 0
всегда печатать текущую строку «Начало кода аналитики»
установить t == 1
], а затем распечатайте текущую строку и нужный файл с помощью системы ("cat myanalytics.txt")
t
равно 1
, поэтому текущая строка никогда не печатается, но когда текущая строка совпадает с "Конец кода аналитики"
, t
снова устанавливается на 0
, поэтому с этого момента следует печатать текущую строку. Примечание:
Это не приведет к редактированию вашего файла index.html
.
Для изменения индекса .html
вы можете:
перенаправить вывод из awk
во временный файл, а затем использовать команду типа mv
или cp
использовать ] sponge
из пакета moreutils
, как показано ниже:
awk '[.. команды, как указано выше ..]' index.html | sponge index.html
Учитывая вашу ситуацию, вот как вы могли бы это сделать:
#!/bin/sh
SOURCE=index.html
if ! test -f "$SOURCE"; then
echo source is missing >&2
exit 1
fi
headLimit=`grep -n '<!-- Analytics code start -->' "$SOURCE" | cut -d: -f1`
tailLimit=`grep -n '<!-- Analytics code end -->' "$SOURCE" | cut -d: -f1`
linennr=`awk '{}END{print NR + 1}' $SOURCE`
if ! test "$headLimit" -gt 0 -a "$tailLimit" -gt 0 >/dev/null; then
echo something is wrong >&2
exit 2
fi
(
head -n$headLimit "$SOURCE"
echo "the stuff I want to inject in place of my analytics code"
tail -n`expr $linennr - $tailLimit` "$SOURCE"
) >"$SOURCE.new"
if test -s "$SOURCE.new"; then
mv "$SOURCE" "$SOURCE.old"
mv "$SOURCE.new" "$SOURCE"
fi
exit 0
Обратите внимание, что любое решение, основанное на ed
, позволило бы фактически заменить in-file, вместо того, чтобы генерировать замену, ... Что, возможно, было бы чище.
я думаю, это может работать
sed -rn '/<!-- Analytics code start -->/{
p; :X n; /<!-- Analytics code end -->/{p;b}; bX
}; p'