SED条件添加行需求:区块内无特定行时插入指定内容
Sed实现:在指定区块的特定行后添加内容(排除含特定关键词的区块)
直接给出可运行的sed命令:
sed -n ' /StartLine/{ :read_block N /^$/!b read_block /NoNoNo/!s/AlwaysExists/AlwaysExists\nAddMe/ p d } p' myfile.ldif
命令解释
-n:关闭sed的默认输出,只输出我们明确指定打印的内容,避免重复输出。- 匹配区块起始行:当遇到
StartLine时,进入区块处理逻辑::read_block:定义循环标签,用于读取整个区块。N:将下一行追加到当前模式空间(把多行合并到一起处理)。/^$/!b read_block:如果当前模式空间末尾不是空行,就跳回read_block标签继续读取,直到把整个区块(包括结尾的分隔空行)都读入模式空间。/NoNoNo/!s/AlwaysExists/AlwaysExists\nAddMe/:检查当前区块是否包含NoNoNo,如果不包含,就把区块里的AlwaysExists替换成AlwaysExists\nAddMe,实现插入新行的效果。p:打印处理后的区块内容。d:清空模式空间,准备处理下一个区块。
p(最后一行):打印非区块起始行的内容(这里主要是区块之间的空行)。
原脚本失效原因
你之前的脚本没有正确分割每个独立区块,而是尝试在全局范围内匹配,导致最终只会在文件末尾执行一次添加操作。上面的命令通过循环读取单个区块到模式空间,确保每个区块都被独立判断和处理,解决了这个问题。
测试效果
用你提供的示例输入运行命令后,输出结果如下:
StartLine Dummy1 AlwaysExists NoNoNo Dummy2 StartLine Dummy1 AlwaysExists AddMe Dummy2 StartLine Dummy1 AlwaysExists NoNoNo Dummy2 StartLine Dummy1 AlwaysExists AddMe Dummy2
内容的提问来源于stack exchange,提问作者LalaBox
相关产品推荐
相关产品推荐

