Como extrair linhas começando com um padrão e pedaços entre dois padrões?

1

Eu tenho arquivos (digamos, infile.tex ) do formulário

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 gostaria de extrair todas as linhas começando com %%## e todas 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}

Eu 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 que começam com %%##

Observação: o texto acima é derivado de isso aqui . Além disso, uma solução de "duas etapas" (primeiro extrair todas as linhas começando com ... e depois todas as partes) também seria possível (eu não vi como e parece que sed permite escolher vários padrões) "então isso parece mais elegante).

    
por Marius Hofert 11.04.2017 / 23:12

2 respostas

5

awk com seu operador de faixa (,) 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}
    
por 11.04.2017 / 23:21
1
sed -e '/^\begin{Sinput}/,/^\end{Sinput}/!{/^%%##/!d}'

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

O operador range em Perl é .. . Usamos a citação do texto a seguir usando o \Q , para que não precisemos explicitamente escapar 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}
    
por 12.04.2017 / 09:20