我想添加下面的文本块//这里有更多的文本区域“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