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