sed删除两个图案之间的线条(不包括末端图案)

sed删除两个图案之间的线条(不包括末端图案),sed,Sed,给定文本 _adsp TXT "dkim=all" VVKMU6SE3C2MF88BG4DJQAECMR9SIIF0 NSEC3 1 1 10 C4F407437E8EA4C5 ( 175MCHR31K25LP89OVJI5LCE0JA2N2AP A MX TXT AAAA RRSIG SPF ) RRSIG NSEC3 7 3 1800 ( 20200

给定文本

_adsp           TXT "dkim=all"
VVKMU6SE3C2MF88BG4DJQAECMR9SIIF0 NSEC3 1 1 10 C4F407437E8EA4C5 (
                175MCHR31K25LP89OVJI5LCE0JA2N2AP
                A MX TXT AAAA RRSIG SPF )
            RRSIG   NSEC3 7 3 1800 (
                20200429171433 20200330161758 11672 example.com
                H3l26qmtkuiFZCeSYCCAo5krFE3gjM0I8UeQ9jhj3STy
                X6fM0YizCHEuv4VZynOJGJc1XJnHRHI+p7yLlZ+OVseK
                UfIkPVP+VOmlerwozEpM+Tnt8evwnMTDbcn0zxf/6YJx
                kZeO2AszWkRZ0bctqW7INYo8YuyyuTSxSr8se27fiaPA
                4GXQymepGgv/JGqargzHbyhhkDhENmNo7Qwkjl+a0kI4
                6qqKcEWCsDvnlYUQiDFzc5oRs2j7TT9uybTfwUDQxV+t
                MQFMhzu7LNbRIUuOb16sAEGSdl9mWQ4sZRJ9wuXJWbso
                G+3tY0pBbq4ffScz/JKcrJ0qAuBF1F5JcQ== )
$TTL 1800
我想去掉带有“(不以空格开头)NSEC3”的部分,直到第一行不以空格字符开头。
结果

_adsp           TXT "dkim=all"
$TTL 1800
在示例中。
我尝试了
sed'/^[^\s].\sNSEC3\s/,/^[^\s]/d;'文件名
但这并不像预期的那样有效,示例结果是

_adsp           TXT "dkim=all"
                H3l26qmtkuiFZCeSYCCAo5krFE3gjM0I8UeQ9jhj3STy
                X6fM0YizCHEuv4VZynOJGJc1XJnHRHI+p7yLlZ+OVseK
                UfIkPVP+VOmlerwozEpM+Tnt8evwnMTDbcn0zxf/6YJx
                kZeO2AszWkRZ0bctqW7INYo8YuyyuTSxSr8se27fiaPA
                4GXQymepGgv/JGqargzHbyhhkDhENmNo7Qwkjl+a0kI4
                6qqKcEWCsDvnlYUQiDFzc5oRs2j7TT9uybTfwUDQxV+t
                MQFMhzu7LNbRIUuOb16sAEGSdl9mWQ4sZRJ9wuXJWbso
                G+3tY0pBbq4ffScz/JKcrJ0qAuBF1F5JcQ== )
$TTL 1800
那么,恢复打印还太早吗

我错过了什么

多谢各位

附言:
您可能会看到我想做的是将DNSSEC部件从命名区域中移除。尚未找到任何其他方法删除RRSIG和NSEC3条目。如果有人有想法,我也会很感激。

[\s]
匹配一个文本
\
s
字符。它与空格不匹配

/^[^\s]/d
(如果
[\s]
可以像您预期的那样工作)还将包括删除最后一行的非前导空格。我想你必须手动循环

在您给出的示例中,以下内容似乎有效:

sed -n '/^[^ \t].*\sNSEC3\s/{ :a; n; /^[^ \t]/bb; ba}; :b; p'
这可能适用于您(GNU-sed):

使用
-n
选项关闭隐式打印

扔掉以非空格开头并包含字符串
NSEC
的行与任何不以非空格开头的行之间的行

打印所有其他行

备选方案:

sed '/^\S.*NSEC/,/^\S/{/^\S.*NSEC\|^\s/d}' file
sed '/^\S.*NSEC/{:a;N;/\n\S/!ba;s/.*\n//}' file
还有另一种选择:

sed '/^\S.*NSEC/,/^\S/{/^\S.*NSEC\|^\s/d}' file
sed '/^\S.*NSEC/{:a;N;/\n\S/!ba;s/.*\n//}' file
还有一个:

sed '/^\S.*NSEC/{:a;N;/\n\S/!s/\n//;ta;D}' file

注意:前两种解决方案将删除行,而不考虑在删除结束时划一条线。而最后两种解决方案仅在删除结束时有一条线划界时才会删除行。

[\s]
[s]
匹配。还有
/^[^\s]/d
将删除
$TTL1800
行。为什么OP会删除几行?因为
[\s]
匹配
s
<代码>/^[^\s].*\sNSEC3\s/-匹配不以\或
s开头且具有
NSEC3
的行。所以基本上
[^\s]
匹配一个空格。当然!我忘了看另一面