我需要在另一个文本文件中的某些占位符之间添加文本文件的内容。 (具体来说,我正试图绕过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
(在other StackOverflow solutions的帮助下:
sed -i '/## START UPSTREAM/,/## END UPSTREAM/ r /etc/nginx/upstream.conf' /etc/nginx/nginx.conf
但是,上面的代码不起作用 - 它只是无声地失败。如何修改sed以正确替换占位符之间的所有文本?
提前致谢!
答案 0 :(得分:1)
这可能适合你(GNU sed):
sed -i -e '/## START UPSTREAM/,/## END UPSTREAM/{//!d;/## START UPSTREAM/r /etc/nginx/upstream.conf' -e '}' /etc/nginx/nginx.conf
答案 1 :(得分:0)
这里使用保留空间的解决方案(...可能不是你想要的):
sed -n '
/\#\# START UPSTREAM/!{H;};
/\#\# START UPSTREAM/{p;};
${x;p;}' /etc/nginx/upstream.conf /etc/nginx/nginx.conf
答案 2 :(得分: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;