Eu tenho arquivos (digamos, infile.tex
) no formato
AAAA
BBBB AAAA
CCCC BBBB AAAA
%%## Just some text
\begin{example}[foobar]
\begin{Sinput}
> set.seed(271)
> U <- runif(10)
> plot(U, 1-U)
\end{Sinput}
AAAA BBBB CCCC
\begin{Sinput}
> plot(qnorm(cbind(U, 1-U)))
\end{Sinput}
\end{example}
e eu gostaria de extrair todas as linhas começando com%%##
etodas as linhas entre \begin{Sinput}
e \end{Sinput}
, então
%%## Just some text
\begin{Sinput}
> set.seed(271)
> U <- runif(10)
> plot(U, 1-U)
\end{Sinput}
\begin{Sinput}
> plot(qnorm(cbind(U, 1-U)))
\end{Sinput}
Tentei trabalhar com sed
:
sed -n '/%%##\|\\begin{Sinput}/,/\\end{Sinput}/p' infile.tex
# mas também contém\begin{example}[foobar]
sed -n '/^%%##\|\\begin{Sinput}/,/\\end{Sinput}/p' infile.tex
# mas não contém linhas começando com%%##
Nota: O texto acima é um pouco derivado deisso aqui. Além disso, uma solução em 'duas etapas' (primeiro extrair todas as linhas começando com... e depois todos os pedaços) também pode ser possível (só não vi como e parece que sed
permite escolher vários 'padrões' para que parece mais elegante).
Responder1
awk
com seu operador de intervalo (,) funciona muito bem para isso. Marque um filtro extra no final (;) e pronto.
awk '/^\\begin\{Sinput\}/,/^\\end\{Sinput\}/;/^%%##/' infile.tex
%%## Just some text
\begin{Sinput}
> set.seed(271)
> U <- runif(10)
> plot(U, 1-U)
\end{Sinput}
\begin{Sinput}
> plot(qnorm(cbind(U, 1-U)))
\end{Sinput}
Responder2
sed -e '/^\\begin{Sinput}/,/^\\end{Sinput}/!{/^%%##/!d}'
perl -lne 'print if /^\Q\begin{Sinput}/ .. /^\Q\end{Sinput}/ or /^%%##/'
O range
operador em Perl
é ..
. Usamos a citação no texto a seguir usando the \Q
para que não precisemos escapar explicitamente dos caracteres especiais.
Resultado
%%## Just some text
\begin{Sinput}
> set.seed(271)
> U <- runif(10)
> plot(U, 1-U)
\end{Sinput}
\begin{Sinput}
> plot(qnorm(cbind(U, 1-U)))
\end{Sinput}