sed
может справиться с этим.
Предполагая, что вы хотите сохранить строки верхнего и нижнего колонтитула -
$: sed -En '/^=+$/,/^=+F I N I S H=+$/ { /^=+$/ { x; d; }; /^[^=]/ { H; d; }; /^=+F I N I S H=+$/{ H; x; p; q; }; }' infile
=================================================================
Data-I-Need
Data-I-Need
...
...
...
Data-I-Need
==========================F I N I S H============================
Если нет, используйте
sed -En '/^=+$/,/^=+F I N I S H=+$/ { /^=+$/ { s/.*//g; x; d; }; /^[^=]/ { H; d; }; /^=+F I N I S H=+$/{ x; p; q; }; }' infile
Обратите внимание, что если вы не используете GNU sed, вам нужно будет вставлять символы новой строки вместо всех этих точек с запятой.
sed -En '
/^=+$/,/^=+F I N I S H=+$/ {
/^=+$/ {
s/.*//g
x
d
}
/^[^=]/ {
H
d
}
/^=+F I N I S H=+$/{
x
p
q
}
}' infile
Data-I-Need
Data-I-Need
...
...
...
Data-I-Need
Разбить его -
sed -En '...'
-En говорит использовать расширенное сопоставление с образцом (-E, которое я действительно использовал только для +
), а не выводить что-либо, если не будет задан вопрос (-n).
/^=+$/,/^=+F I N I S H=+$/ {...}
говорит, что выполняет эти команды только между строками, которые являются =
, и строками, которые являются =
, за исключением F I N I S H
где-то посередине. Все вещи между {}
будут проверены на всех строках между ними. Это означает, что с первой =+
строки, но это нормально, мы справимся с этим внутри.
(a) /^=+$/ { x; d; };
(b) /^=+$/ { s/.*//g; x; d; };
(a)
говорит в каждой из строк, которые являются =
, поменять местами (x
) текущую строку («пространство образца») с «пробелом удержания», а затем удалить (d
) ) образец пространства. Это сохраняет текущую строку и удаляет все, что вы могли накопить выше при фальстартах. (Помните -n не пускает ничего от печати, пока мы этого не хотим.)
(b)
говорит, что сначала стереть текущую строку, ТО поменять местами и удалить. Это будет все еще добавлять новую строку. Вы хотели, чтобы это удалили?
/^[^=]/ { H; d; };
Обе версии используют это. В любой строке, которая не начинается с =
, добавьте его в область удержания (H
), а затем удалите пространство шаблона (d
). Удаление всегда перезапускает цикл, читая следующую запись.
(a) /^=+F I N I S H=+$/{ H; x; p; q; };
(b) /^=+F I N I S H=+$/{ x; p; q; };
В любой строке со строкой часового F I N I S H
между всеми =
, (a)
сначала добавит (H
) шаблон в область удержания - (b)
не будет. Затем оба поменяют местами образец и удерживают пробелы (x
), напечатают (p
) пространство образца (которое теперь является значением, накопленным в пространстве удержания), а затем удаляют (d
) пространство образца, вызывая следующий цикл.
В этот момент вы будете вне первоначального переключения, поэтому, если не произойдет еще одна строка из всех =
, вы пропустите все оставшиеся строки. Если он это сделает, он снова начнет накапливать записи, но не распечатает их, пока не достигнет другой записи F I N I S H
.
}' infile
Это просто закрывает скрипт и передает имя файла, которое вы использовали. Обратите внимание, что это не редактирование на месте ...
Надеюсь, это поможет.