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

时间:2013-08-05 21:00:38

标签: bash sed

我需要在另一个文本文件中的某些占位符之间添加文本文件的内容。 (具体来说,我正试图绕过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以正确替换占位符之间的所有文本?

提前致谢!

3 个答案:

答案 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;