Заменить содержимое внутри двух определенных строк

Предполагая, что все разделенные файлы имеют одинаковое имя, вы можете использовать. Нет необходимости в петле.

LINE_TO_INSERT=$(head -1 originalFile)
sed -i "1s/^/${LINE_TO_INSERT/\\/\\\\}\n/" segment??
3
03.01.2017, 21:52
3 ответа

Решение с 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 
     
2
27.01.2020, 21:26

Учитывая вашу ситуацию, вот как вы могли бы это сделать:

#!/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, вместо того, чтобы генерировать замену, ... Что, возможно, было бы чище.

0
27.01.2020, 21:26

я думаю, это может работать

sed -rn '/<!-- Analytics code start -->/{ 
           p; :X n; /<!-- Analytics code end -->/{p;b}; bX
        }; p' 
0
27.01.2020, 21:26

Теги

Похожие вопросы