Это может работать для вас (GNU sed):
sed '/CAPTURE/!d;:a;n;:b;//ba;$d;N;bb' file
Удалять все строки до первой, содержащей требуемую строку.Выведите строку, содержащую требуемую строку.Замените пространство шаблона следующей строкой.Если эта строка содержит требуемую строку, повторите два последних предыдущих предложения.Если это последняя строка файла, удалите пространство шаблона.В противном случае добавьте следующую строку и повторите последние три предыдущих предложения.
Изучив тестовые файлы, используемые для теста haukex, может показаться, что sed не является инструментом для извлечения этого файла.Использование сочетаний csplit, grep и sed представляет собой достаточно быстрое решение следующим образом:
lines=$(grep -nTA1 --no-group-separator CAPTURE oldFile |
sed '1s/\t.*//;1h;$!d;s/\t.*//;H;x;s/\n/ /')
csplit -s oldFile $lines && rm xx0{0,2} && mv xx01 newFile
Разделить исходный файл на три файла.Файл, предшествующий первому вхождению CAPTURE
, файл от первого CAPTURE
до последнего CAPTURE
и файл, содержащий остаток.Первый и третий файлы удаляются, а второй файл переименовывается.
csplit
может использовать номера строк для разделения исходного файла.grep
чрезвычайно быстро фильтрует шаблоны и может возвращать номера строк всех шаблонов, которые соответствуют CAPTURE
, и следующую контекстную строку.sed
может манипулировать результатами grep
в виде двух номеров строк, которые передаются команде csplit
.
При запуске с тестовыми файлами (как указано выше) время ожидания составляет около 10 секунд.