sed插入线位于两个括号之间的倒数第二行

时间:2019-02-28 13:06:01

标签: sed

我有一个包含以下信息的区域文件:

using System;
using System.Diagnostics;
using System.Linq;

namespace ProcArgs
{
    class Program
    {
        static void Main(string[] args)
        {
            var process = Process.GetProcessesByName("svchost").FirstOrDefault();
            Console.WriteLine(process.StartInfo.Arguments);
        }
    }
}

,依此类推。我需要grep example.com ,并在方括号内添加三行。

我可以得到整个支架:

zone "example.com" {
    type master;
    file "master/example.com";
};
zone "example.org" {
    type master;
    file "master/example.org";
};

结果:

sed -n '/zone \"example.com\" {/,/};/p' zones.local

我需要添加以下三行,以便最终结果如下:

zone "example.com" {
        type master;
        file "master/example.com";
};

但是无论我如何尝试,我都无法使其正常工作。 我已经尝试过例如:

zone "example.com" {
        type master;
        file "master/example.com";
        key-directory "/etc/bind/keys/example.com";
        inline-signing yes;
        auto-dnssec maintain;
};
zone "example.org" {
        type master;
        file "master/example.org";
};

但这将添加到整个文件的倒数第二行,而不是第一个正则表达式结果的倒数第二行。 我可以以某种方式使其附加到第一个正则表达式中吗?

我完全被困住了,希望能得到som的帮助!

1 个答案:

答案 0 :(得分:1)

这可能对您有用(GNU sed):

sed '/^zone "example.com" {/{:a;h;n;/^};/!ba;x;s#\S.*#key-directory "/etc/bind/keys/example.com";#p;s/\S.*/inline-signing yes;/p;s/\S.*/auto-dnssec maintain;/p;x}' file

关注文件one "example.com" {};之间的行,所有其他行将照常打印。

遇到以zone "example.com" {开头的行时,请使用h命令进行复制,然后打印当前行,并使用n命令将其替换为下一行。

如果当前行没有以};开始,请重复执行直到它开始,然后使用x命令并使用替代命令s交换到复制的最后一行,将非到行尾的带空格的文本,并带有所需的新文本,然后将其打印nb替换命令上的p标志。这样可以保留缩进并有效地在结束};之前插入文本。

重复以上操作,插入剩余的新文本,最后交换回图案空间并打印出来。