我想添加以下文本块 //这里有更多文字 zone" mysite.com" { 类型大师; file" mysite.com.fwd&#34 ;; 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
模式中的{{1}}与sed不匹配。
感谢您在高级方面的帮助
答案 0 :(得分:1)
我会这样做:
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的另一种方法更灵活 - 使用文件,你有新的块:
sed "/^};/r block.conf" test.conf
在这里,我们只需使用读取命令block.conf
将文本从test.conf
添加到r
。 /^};/
再次成为你的模式。
这个范围模式应该是/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
。然后我们将空白块从空行开始追加到第二行。
此处还有一些有用的方法:How to sed a block of text with specific pattern?
答案 1 :(得分:0)
sed
不适合它。在shell中执行它很简单:
cat file1 >> file2
表示将file1
中的内容追加到file2
的末尾。
更新:
sed -e '$r file1' file2 > file2
会起作用。
仍然不明白为什么sed
比shell更安全。
答案 2 :(得分:0)
如果你想要一个合适的&强大的解决方案,有一些perl模块来解析bind8配置文件。
答案 3 :(得分:0)
将以下代码填入“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
答案 4 :(得分:0)
我无法在MacOS上使用任何这些工具。
这对我有用:
sed -i '' "/^\s*};/ a \\
\\
\zone "mysite.com" {\\
\ type master;\\
\ file "mysite.com.fwd";\\
\ allow-update { none; };\\
\};\\
" filename
使用以下脚本对此进行了测试。它将创建一个新文件,将其打印出来,对其进行修改并再次打印:
testfile="testsed.txt"
rm ${testfile}
cat <<EOF > ${testfile}
//There are more lines up here
zone "." IN {
type hint;
file "named.ca";
};
EOF
cat ${testfile}
sed -i '' "/^\s*};/ a \\
\\
\zone "mysite.com" {\\
\ type master;\\
\ file "mysite.com.fwd";\\
\ allow-update { none; };\\
\};\\
" ${testfile}
echo
echo "==== After Transform ===="
echo
cat ${testfile}