1

別のテキスト ファイルの特定のプレースホルダーの間にテキスト ファイルの内容を追加する必要があります。(具体的には、アップストリーム ブロック内の nginx include 制限を回避しようとしています。)

私のメインの 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 {
...
}

これまでのところ、私は(他のStackOverflowソリューションsedの助けを借りて)使用しようとしました:

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

ただし、上記のコードは機能しません。サイレントに失敗するだけです。sed を変更して、プレースホルダー間のすべてのテキストを適切に置き換えるにはどうすればよいですか?

前もって感謝します!

4

3 に答える 3

1

これはうまくいくかもしれません(GNU sed):

sed -i -e '/## START UPSTREAM/,/## END UPSTREAM/{//!d;/## START UPSTREAM/r /etc/nginx/upstream.conf' -e '}' /etc/nginx/nginx.conf
于 2013-08-05T21:13:55.033 に答える
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;
于 2013-08-05T22:13:23.737 に答える
0

ホールドスペースを使用したここでの解決策(...おそらくあなたが探しているものではありません):

sed -n '
/\#\# START UPSTREAM/!{H;}; 
/\#\# START UPSTREAM/{p;}; 
${x;p;}' /etc/nginx/upstream.conf /etc/nginx/nginx.conf
于 2013-08-05T21:27:18.700 に答える