sed Удалить линии между двумя шаблонами (исключая конечный шаблон) - PullRequest
1 голос
/ 05 апреля 2020

данный текст похож на

_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

, поэтому слишком рано возобновлять печать?

что мне не хватает?

спасибо

PS: вы можете увидеть, что я хочу сделать, это удалить детали DNSSE C из именованной зоны. пока не нашел другого способа удалить записи RRSIG и NSEC3. Если у кого-то есть идея, я бы это тоже оценил.

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

[\s] соответствует буквальному \ или s символам. Он не соответствует пробелу.

/^[^\s]/d; (если [\s] будет работать, как вы ожидаете), также будет включать удаление последней строки с не начальными пробелами. Я думаю, что вам нужно l oop вручную.

В приведенном вами примере, похоже, работает следующее:

sed -n '/^[^ \t].*\sNSEC3\s/{ :a; n; /^[^ \t]/bb; ba}; :b; p'
0 голосов
/ 06 апреля 2020

Это может работать для вас (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

NB Первые два решения будут удалять строки независимо от строки, ограничивающей конец удалений. Принимая во внимание, что последние два решения будут удалять только строки, если есть строка, ограничивающая конец удалений.

...