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 sed
permite elegir varios 'patrones' para que parece más elegante).
Respuesta1
awk
con 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 range
operador en Perl
es ..
. Usamos la cita del siguiente texto usando \Q
para 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}