текст между 2 словами с некоторыми строками перед шаблонами

как я могу найти строки между двумя словами с 3 строками перед START_WORD в sed или grep или...

например, произведенный от команды:

my name is
Mansour
and I confuse to
use sed
or grep for
piping my command output
to get 
my ideal output

и я хочу мой после передачи по каналу команды с sed или grep на START_WORD=command и END_WORD=ideal:

and I confuse to
use sed
or grep for
piping my command output
to get 
my ideal output
1
задан 9 February 2016 в 11:28

2 ответа

Можно сделать:

grep -Pzo '(?s)\n\K([^\n]*\n){3}[^\n]*command[^\n]*\n.*?\n[^\n]*ideal[^\n]*(?=\n)' file.txt
  • -P включает Perl, Совместимый Regex, -z делает входные данные разделенными на ASCII, который впускает NUL, а не обычная новая строка, -o, берут только подобранную часть

  • (?s), модификатор DOTALL, это позволяет нам соответствовать новой строке (\n) . маркер

  • \n\K([^\n]*\n){3} соответствия \n сначала и затем отбрасывает соответствие \K, ([^\n]*\n){3} соответствия три строки перед строкой, содержащей command

  • [^\n]*command[^\n]*\n.*?\n[^\n]*ideal[^\n]*(?=\n) соответствия все строки, начинающие со строки, имеющей command до строки, содержащей ideal

Пример:

% cat file.txt
my name is
Mansour
and I confuse to
use sed
or grep for
piping my command output
to get 
my ideal output

% grep -Pzo '(?s)\n\K([^\n]*\n){3}[^\n]*command[^\n]*\n.*?\n[^\n]*ideal[^\n]*(?=\n)' file.txt
and I confuse to
use sed
or grep for
piping my command output
to get 
my ideal output
2
ответ дан 7 December 2019 в 12:41

Другой способ использовать Perl:

perl -ne 'BEGIN{ my @buffer } unshift(@buffer, $_); splice(@buffer, 4); if(/\bcommand\b/) { print(reverse(@buffer)); while(<>) { print(); /\bideal\b/ && exit } exit }' file
  • n: Perl причин для принятия следующего цикла вокруг программы, которая заставляет его выполнить итерации по аргументам имени файла несколько как sed-n или awk:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
    
  • -e: может использоваться для ввода одной строки программы.
  • BEGIN{ my @buffer } unshift(@buffer, $_); splice(@buffer, 4); if(/\bcommand\b/) { print(reverse(@buffer)); while(<>) { print(); /\bideal\b/ && exit } exit }: вставляет текущую строку в начале буфера и усекает буфер к длине 4; если текущая строка содержит слово command, печатает буфер в обратном порядке и выполняет итерации через все остающиеся строки, печатающие их; если печатная строка содержится ideal или конец файла был достигнут, выходы.
% cat file
my name is
Mansour
and I confuse to
use sed
or grep for
piping my command output
to get 
my ideal output
% perl -ne 'BEGIN{ my @buffer } unshift(@buffer, $_); splice(@buffer, 4); if(/\bcommand\b/) { print(reverse(@buffer)); while(<>) { print(); /\bideal\b/ && exit } exit }' file
and I confuse to
use sed
or grep for
piping my command output
to get 
my ideal output
%
1
ответ дан 7 December 2019 в 12:41

Другие вопросы по тегам:

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