在不同文件的占位符之间添加文件内容



我需要在另一个文本文件的某些占位符之间添加文本文件的内容。(具体来说,我试图绕过上游区块内的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;
  ...
}

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

## 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以正确替换占位符之间的所有文本?

提前感谢!

这可能对你有用(GNU sed):

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

我会使用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)[sS]*?(## END UPSTREAM)/$1n$inc$2/;
open FILE, ">$config" or die $!; print FILE $cnf; close FILE;

这里是使用保留空间的解决方案(…可能不是您想要的):

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

最新更新