Resultado

Resultado

Tengo archivos (digamos infile.tex) del formulario

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}

y me gustaría extraer todas las líneas que comienzan con%%## ytodas las líneas entre \begin{Sinput}y \end{Sinput}, entonces

%%## 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}

Intenté trabajar con sed:

sed -n '/%%##\|\\begin{Sinput}/,/\\end{Sinput}/p' infile.tex# pero también contiene\begin{example}[foobar]

sed -n '/^%%##\|\\begin{Sinput}/,/\\end{Sinput}/p' infile.tex# pero no contiene líneas que comiencen con%%##

Nota: Lo anterior se deriva en cierta medida deesto aqui. Además, también podría ser posible una solución de 'dos ​​pasos' (primero extraer todas las líneas que comienzan con... y luego todos los fragmentos) (simplemente no vi cómo y parece que sedpermite elegir varios 'patrones' para que parece más elegante).

Respuesta1

awkcon su operador de rango (,) funciona bastante bien para esto. Etiqueta un filtro adicional al final (;) y listo.

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}

Respuesta2

sed -e '/^\\begin{Sinput}/,/^\\end{Sinput}/!{/^%%##/!d}'

perl -lne 'print if /^\Q\begin{Sinput}/ .. /^\Q\end{Sinput}/ or /^%%##/'

El rangeoperador en Perles ... Usamos la cita del siguiente texto usando \Qpara que no necesitemos escapar explícitamente los caracteres especiales.

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}

información relacionada