как я могу найти строки между двумя словами с 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
Можно сделать:
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
Другой способ использовать 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
%