Você pode fazer:
grep -Pzo '(?s)\n\K([^\n]*\n){3}[^\n]*command[^\n]*\n.*?\n[^\n]*ideal[^\n]*(?=\n)' file.txt
-
-P
ativa o Regex compatível com Perl,-z
torna os dados de entrada separados em ASCII NUL em vez da nova linha usual,-o
deixa apenas a parte correspondida -
(?s)
é o modificador DOTALL, isso nos permite corresponder a nova linha (\n
) com.
token -
\n\K([^\n]*\n){3}
corresponde\n
primeiro e, em seguida, descarta a correspondência\K
,([^\n]*\n){3}
corresponde a três linhas antes da linha que contémcommand
-
[^\n]*command[^\n]*\n.*?\n[^\n]*ideal[^\n]*(?=\n)
corresponde a todas as linhas a partir da linha que temcommand
até a linha que contémideal
Exemplo:
% 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