使用sed添加行失败求助:为指定域名在also-notify后插入内容
问题分析与解决方案
你的sed命令无效主要有两个核心问题,咱们一个个拆解清楚:
1. 正则表达式不兼容sed的语法
sed默认使用基础正则表达式(BRE),而你用的.*?是Perl兼容正则(PCRE)里的非贪婪匹配语法,sed的BRE完全不支持这个写法!
在sed中,?会被当作字面字符处理,所以你的正则/"example\.net".*?also-notify.*?};/实际上是在找包含"example.net"、.*(贪婪匹配任意字符)、字面量?、also-notify、再.*、字面量?、};的行,这显然和你的目标行不匹配,自然不会触发后续的追加操作。
2. a命令的语法错误
sed的追加命令a的正确格式是:
- POSIX标准sed:
a\后跟换行,再写要追加的内容 - GNU sed(大部分Linux系统默认的sed):可以简化成
a 要追加的内容
而你写的a\nxxxxxxx/s里,/s是完全多余的,这不是sed的合法语法,即使正则匹配成功,这个错误的语法也会导致命令执行失败。
修正后的命令
方案1:兼容POSIX标准的写法(适用于所有sed版本)
sed '/"example\.net"[^}]*also-notify[^}]*};/a\ xxxxxxx' named.conf.local
这里用[^}]*替代.*,避免贪婪匹配到其他zone的内容(因为你的zone配置是单行的,[^}]*只会匹配到当前zone的}之前的内容,匹配更精准)。
方案2:GNU sed简化写法(Linux系统常用)
sed '/"example\.net"[^}]*also-notify[^}]*};/a xxxxxxx' named.conf.local
如果你的目标是追加新的also-notify条目,比如also-notify { z.z.z.z; };,可以直接把内容写进去:
sed '/"example\.net"[^}]*also-notify[^}]*};/a\ also-notify { z.z.z.z; }; ' named.conf.local
内容的提问来源于stack exchange,提问作者user4893295
相关产品推荐
相关产品推荐

