Параметр -A для grep может это сделать. Обычно используется для контекста после совпадений и -B для контекста до совпадений .Параметр -m ограничивает количество совпадений.
grep -A1000000 -m1 <search> <file>
будет выводить до 1000000 завершающих строк контекста (и чтобы эта работа работала, просто убедитесь, что число больше, чем количество строк в файле - и если ваш файл имеет длину более 1000000 строк, grep, вероятно, не правильный инструмент). Аналогичным образом
grep -B1000000 -m1 <search> <file>
распечатает все строки до первого совпадения включительно. (Насколько мне известно, эти параметры используются не по назначению, но это естественный побочный эффект того, как они работают: альтернативой является использование программы, отличной от grep.)
Вы можете использоватьperl
:
echo -e "aaaaaaaaa\n#some info\nother rows\nend row#\nanother info" |\
perl -0777 -ne '/#([^#]*)#/ && print $1,"\n"; '
Пояснение:
-0777
выделить весь файл как одну строку (включить многострочное сопоставление)/#([^#]*)#/
соответствует не -#символам [^#]
между слишком #
и с помощью квадратных скобок добавляется как первая совпадающая группа. && print $1,"\n"
если найдено, вывести первую совпадающую группу и последнюю новую строку. Небольшая адаптация под ваш sed
одновальный вкладыш:
echo -e "aaaaaaaaa\n#some info\nother rows\nend row#\nanother info" |
sed -n '/^#/,/#$/ {s/#//;p;}'
Выход:
some info
other rows
end row