使用sed添加一个又一个文本块

时间:2014-12-11 17:33:13

标签: regex linux bash sed

我想添加以下文本块     //这里有更多文字     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不匹配。

感谢您在高级方面的帮助

5 个答案:

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

如果你想要一个合适的&强大的解决方案,有一些模块来解析bind8配置文件。

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

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