Resultado

Resultado

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 sedpermite escolher vários 'padrões' para que parece mais elegante).

Responder1

awkcom 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 rangeoperador em Perlé ... Usamos a citação no texto a seguir usando the \Qpara 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}

informação relacionada