使用sed添加一行

时间:2018-05-21 17:35:21

标签: regex sed

似乎无法找到正确的方法来执行此操作,尽管在reg检查器中检查我的正则表达式。

给定一个文本文件,其中包含此条目:

zone    "example.net"    {
        type master;
        file "/etc/bind/zones/db.example.net";
        allow-transfer { x.x.x.x;y.y.y.y; };
        also-notify { x.x.x.x;y.y.y.y; };
};

我想专门为该域添加通知行后面的行。

所以使用这个sed命令字符串:

sed '/"example\.net".*?also-notify.*?};/a\nxxxxxxx/s' named.conf.local

我认为应该在行之后添加'xxxxxxx'。但不,不。我做错了什么?

3 个答案:

答案 0 :(得分:0)

关注awk可能对此有所帮助。

awk -v new_lines="new_line here" '/also-notify/{flag=1;print new_lines} /^};/{flag=""} !flag'  Input_file

如果您想编辑Input_file本身,请将> temp_file && mv temp_file Input_file附加到上面的代码中。另外print new_lines这里new_lines是一个变量,你可以在那里直接打印新的留置权。

答案 1 :(得分:0)

使用POSIX sed,您可以使用带有转义文字新行的a for append命令:

$ sed  '/^[[:blank:]]*also-notify/ a\
NEW LINE' file

使用GNU sed,a稍微更自然,因为假定了新行:

$ gsed  '/^[[:blank:]]*also-notify/ a NEW LINE' file

您示例中的sed问题有两个问题。

第一个是sed正则表达式不能用于example\.net".*?also-notify.*?中的多行匹配。这更像是perl类型匹配。您需要使用范围运算符作为开头,如下所示:

$ sed  '/"example\.net/,/also-notify/{
       /^[[:blank:]]*also-notify/ a\
    NEW LINE 
    }' file

第二个问题是附加文本中的\n。使用POSIX sed,任何上下文都不支持\n。使用GNU sed时,假定新行,\n不在上下文中(如果紧接在a之后)并被解释为转义文字n。您可以在1个字符后使用\n和GNU sed,但不能在之后立即使用。在POSIX sed中,将始终剥离附加行的前导空格。

答案 2 :(得分:0)

你已经非常接近了。只需使用范围(/pattern/,/pattern/{ #commands })选择要操作的文本,然后使用/pattern/a/\ ...添加所需的行。

/"example\.net"/,/also-notify/{
/also-notify/a\
\        this is the text I want to add.
}

sed修剪要附加的文本的前导空格。在行的开头添加反斜杠\可以防止这种情况。

在Bash中,这看起来像是:

sed -e '/"example\.net"/,/also-notify/{
  /also-notify/a\
  \        this is the text I want to add.
  }' named.conf.local

另请注意,sed使用较旧的正则表达式方言,不支持非贪婪量化,如*?