我有一个包含以下信息的区域文件:
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的帮助!
答案 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
标志。这样可以保留缩进并有效地在结束};
之前插入文本。
重复以上操作,插入剩余的新文本,最后交换回图案空间并打印出来。