1

我需要在另一个文本文件中的某些占位符之间添加文本文件的内容。(具体来说,我试图绕过 nginx包括上游块内的限制。)

我的主要 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;
  ...
}

我想在and块/etc/nginx/upstream.conf之间复制 in的内容。期望的结果:## START UPSTREAM## END UPSTREAM

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

http {
...
}

到目前为止,我已经尝试使用sed(在其他 StackOverflow 解决方案的帮助下):

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

这里使用保持空间的解决方案(......可能不是你要找的):

sed -n '
/\#\# START UPSTREAM/!{H;}; 
/\#\# START UPSTREAM/{p;}; 
${x;p;}' /etc/nginx/upstream.conf /etc/nginx/nginx.conf
于 2013-08-05T21:27:18.700 回答
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 回答