【问题标题】:sed Remove lines between two patterns (excluding end pattern)sed 删除两个模式之间的线(不包括结束模式)
【发布时间】:2020-04-06 05:48:23
【问题描述】:

给定的文本喜欢

_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;' filename,但没有按预期工作,示例结果为

_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; 也将删除 $TTL 1800 行。

标签: sed


【解决方案1】:

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

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

在您给出的示例中,以下似乎可行:

sed -n '/^[^ \t].*\sNSEC3\s/{ :a; n; /^[^ \t]/bb; ba}; :b; p'

【讨论】:

  • 为什么 OP 会删除几行呢?
  • 因为[\s] 匹配s/^[^\s].*\sNSEC3\s/ - 匹配不以 \ 或 s 开头并具有 NSEC3 的行。所以基本上[^\s] 匹配一个空格。
  • 当然!我忘了看另一边
【解决方案2】:

这可能对你有用(GNU sed):

sed -n '/^\S.*NSEC/{:a;n;/^\S/!ba};p' file

使用-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/{:a;N;/\n\S/!s/\n//;ta;D}' file

注意前两个解决方案将删除行,而不管分隔删除结束的行。而后两种解决方案只会在删除结束时有一行分隔行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-15
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多