Ваш подход будет работать, если есть нечетное количество пустых строк, но он потерпит неудачу, если есть четное число.Ваш скрипт sed
представляет собой цикл следующего:
- захватывает строку L1 и добавляет ее в пространство шаблона
- , если L1 не является пустым, напечатайте его;но если пусто , то:
- возьмите другую строку, L2 и добавьте ее в пространство шаблона
- , если L2 содержит
#matchee
, отбрасывает L1 из пространства шаблона - печатает пространство шаблона, состоящее из L1 и L2 или просто из L2
Вы заметите, что L2 всегда печатается, даже если оно пустое и сопровождаетсястрока, содержащая #matchee
.Он защищен тем, что сразу следует нечетное количество пустых строк.
Отредактировано, чтобы добавить: Чтобы исправить вышеописанную проблему, вы можете добавить внутренний цикл, используя *Команда 1044 * для создания метки и команда b
для ее «ветвления» (переход).Это:
sed '/^[ \t]*$/{: a;N;/#matchee/!P;D;/^[ \t]*$/b a}' file.txt
представляет собой цикл следующего:
- захватывает строку L1 и добавляет ее в пространство шаблона
- если L1 не пусто, распечатайте его;но если оно пусто , то:
- создать метку
a
← это неактивно, просто место для goto
- , чтобы взять другую строку, L2 и добавьте его в пространство шаблона
- , если L2 не не содержит
#matchee
, печать L1 - сброс L1 из пространства шаблона (независимо от того, печатали мы его или нет)
- теперь мы можем думать о L2 как L1 ;это единственное в пространстве шаблона
- , если переименованный L1 пуст,
goto a