用sed添加一个接一个的文本块

我想添加下面的文本块//这里有更多的文本区域“mysite.com”{type master; 文件“mysite.com.fwd”; allow-update {none; }; };

就在下面显示的文本块之后

zone "." IN { type hint; file "named.ca"; }; 

该文件最终应该如下所示

  //There are more lines up here zone "." IN { type hint; file "named.ca"; }; zone "mysite.com" { type master; file "mysite.com.fwd"; allow-update { none; }; }; //There are more lines below here 

这里的困难是\n在匹配的模式下不能使用sed

感谢您的高级帮助

我会这样做:

 sed "/^};/a \ \nzone \"mysite.com\" {\n type master;\n file \"mysite.com.fwd\";\n allow-update { none; };\n};\n" test.conf 

之前

 zone "." IN { type hint; file "named.ca"; }; 

 zone "." IN { type hint; file "named.ca"; }; zone "mysite.com" { type master; file "mysite.com.fwd"; allow-update { none; }; }; 

^}; 是一个模式,在这之后你使用a追加你的新块,如果你需要它可以改变模式。

另一种更灵活的方法 – 使用文件,其中你有新的块:

 sed "/^};/r block.conf" test.conf 

这里我们只是使用读命令r将文本从block.conf添加到test.conf/^};/再一次你的模式。

这个范围模式应该是uniqe /file \"named.ca\";/,/^};/我想所以这应该对你很有用

 sed "/file \"named.ca\";/,/^};/ { /file*/n a \ \nzone \"mysite.com\" {\n type master;\n file \"mysite.com.fwd\";\n allow-update { none; };\n};\n } " test.conf 

//,//结构表示从具有适当模式的行开始并以另一个结束的范围模式。 在我们的例子中,它是2行模式,我们想跳过第一行,这里是/file*/n 。 然后我们在空白行的第二行添加我们的块。

一些有用的方法也在这里: 如何sed具有特定模式的文本块?

sed不是一个好的工具。 在shell中执行它非常简单:

 cat file1 >> file2 

它意味着将file1中的内容追加到file2的末尾。

更新:

 sed -e '$r file1' file2 > file2 

会工作。

还是不明白为什么sed比shell更安全。

如果你想要一个合适的和健壮的解决方案,有一些perl的模块来解析bind8配置文件。

检查Unix :: Conf :: Bind8 :: Conf

假如下面的代码在“my_file”中,而用“^”代替新的一行字符来得到一个大的一行。 我们现在可以匹配"file "named.ca";的模式,然后在此之后替换新的代码,之后将”^“转换回换行符”\ n“。

 cat 'my_file'|tr '\n' '^'|sed 's#//There are more lines up here- zone.*\(file "named.ca"\).*#\1 zone "mysite.com" {\n type master;\n file "mysite.com.fwd";\n allow-update { none; }; };\n#g'|tr '^' '\n' 

结果

 //There are more lines up here zone "." IN { type hint; file "named.ca"; }; zone "mysite.com" { type master; file "mysite.com.fwd"; allow-update { none; }; }; //There are more lines below here