似乎无法找到正确的方法来执行此操作,尽管在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'。但不,不。我做错了什么?
答案 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使用较旧的正则表达式方言,不支持非贪婪量化,如*?
。