2013-08-05 2 views
1

Мне нужно добавить содержимое текстового файла между некоторыми заполнителями в другом текстовом файле. (. В частности, я пытаюсь обойти Nginx include limitation inside upstream blocks)добавить содержимое файла между заполнителями в другом файле

Мой файл конфигурации основной Nginx /etc/nginx/nginx.conf выглядит следующим образом:

## START UPSTREAM 

## END UPSTREAM 

http { 
... 
} 

Мой сервер вверх файл /etc/nginx/upstream.conf выглядит следующим образом:

upstream wordpress { 
    server 10.0.0.1; 
    server 10.0.0.2; 
    ... 
} 

Я хочу скопировать содержимое /etc/nginx/upstream.conf между ## START UPSTREAM и ## END UPSTREAM блоков. Желаемый результат:

## START UPSTREAM 
upstream wordpress { 
    server 10.0.0.1; 
    server 10.0.0.2; 
    ... 
} 
## END UPSTREAM 

http { 
... 
} 

До сих пор я пытался использовать sed (с помощью otherStackOverflowsolutions):

sed -i '/## START UPSTREAM/,/## END UPSTREAM/ r /etc/nginx/upstream.conf' /etc/nginx/nginx.conf 

Однако приведенный выше код не работает - это просто терпит неудачу. Как изменить sed для правильной замены всего текста между заполнителями?

Заранее благодарен!

ответ

1

Это может работать для вас (GNU СЭД):

sed -i -e '/## START UPSTREAM/,/## END UPSTREAM/{//!d;/## START UPSTREAM/r /etc/nginx/upstream.conf' -e '}' /etc/nginx/nginx.conf 
+0

Я получаю сообщение об ошибке: SED: -e выражение # 1, символ 1: неизвестная команда: '-» –

+0

Oops из ошибка с флагами - см. править. – potong

+0

А, спасибо, сейчас работает. Однако каждый раз, когда я запускаю команду, он дублирует блок следующим образом: http://pastebin.com/Zvv8eb3e. Как я могу убедиться, что он также заменяет все содержимое текущего блока? –

0

Здесь решение с использованием трюма (... вероятно, не то, что вы ищете):

sed -n ' 
/\#\# START UPSTREAM/!{H;}; 
/\#\# START UPSTREAM/{p;}; 
${x;p;}' /etc/nginx/upstream.conf /etc/nginx/nginx.conf 
0

Я хотел бы использовать Perl, а не sed для этого:

#!/usr/bin/env perl 

use strict; 
use warnings; 

my $config = '/etc/nginx/nginx.conf'; 
my $upstream = '/etc/nginx/upstream.conf'; 

local $/; 
open FILE, "<$config" or die $!; my $cnf=<FILE>; close FILE; 
open FILE, "<$upstream" or die $!; my $inc=<FILE>; close FILE; 

$cnf =~ s/(## START UPSTREAM)[\s\S]*?(## END UPSTREAM)/$1\n$inc$2/; 

open FILE, ">$config" or die $!; print FILE $cnf; close FILE; 
Смежные вопросы