Извлечь текст между двумя символами (многострочный ввод) [дублировать]

Параметр -A для grep может это сделать. Обычно используется для контекста после совпадений и -B для контекста до совпадений .Параметр -m ограничивает количество совпадений.

grep -A1000000 -m1 <search> <file>

будет выводить до 1000000 завершающих строк контекста (и чтобы эта работа работала, просто убедитесь, что число больше, чем количество строк в файле - и если ваш файл имеет длину более 1000000 строк, grep, вероятно, не правильный инструмент). Аналогичным образом

grep -B1000000 -m1 <search> <file>

распечатает все строки до первого совпадения включительно. (Насколько мне известно, эти параметры используются не по назначению, но это естественный побочный эффект того, как они работают: альтернативой является использование программы, отличной от grep.)

5
31.12.2018, 11:35
2 ответа

Вы можете использоватьperl:

echo -e "aaaaaaaaa\n#some info\nother rows\nend row#\nanother info" |\
perl -0777 -ne '/#([^#]*)#/ && print $1,"\n"; '

Пояснение:

  • -0777выделить весь файл как одну строку (включить многострочное сопоставление)
  • /#([^#]*)#/соответствует не -#символам [^#]между слишком #и с помощью квадратных скобок добавляется как первая совпадающая группа.
  • && print $1,"\n"если найдено, вывести первую совпадающую группу и последнюю новую строку.
5
27.01.2020, 20:34

Небольшая адаптация под ваш sedодновальный вкладыш:

echo -e "aaaaaaaaa\n#some info\nother rows\nend row#\nanother info" |
sed -n '/^#/,/#$/ {s/#//;p;}'

Выход:

some info
other rows
end row
5
27.01.2020, 20:34

Теги

Похожие вопросы