Usando sed para combinar vários ambientes possíveis em um arquivo

1

Eu tenho alguns arquivos numerados de 01 a 24 que contêm coisas como

\begin{thm}
  blah blah blah
\end{thm}
\begin{lem}
  blah blah blah
\end{lem}
\begin{prop}
  blah blah blah
\end{prop}

dentro deles e eu quero extrair cada uma dessas correspondências do arquivo (junto com o 'blah blah blah', é claro). Então eu estava feliz em usar

sed -n '/\begin{FOO}/,/\end{FOO}/p' ./*.tex >> newfile.txt

e executando o acima com FOO substituído por thm , em seguida, lem , em seguida, prop . Mas eu percebi que sou burro porque o pedido está todo misturado agora em newfile.txt , no sentido de que todos os \begin{thm}...\end{thm} precedem todos os begin{lem}...\end{lem} antes de todos os begin{prop}...\end{prop} , mesmo que eles sigam um ao outro em um dos arquivos digamos, mas eu quero mantê-los na ordem em que aparecem nos arquivos.

Question: How can I get sed to extract all of these case at once, and thus preserve the order that they appear in the files?

    
por sdf 29.12.2013 / 20:16

2 respostas

2

Se eu acertei você, você precisa obter todos os intervalos de uma só vez. Você pode fazê-lo seguindo a construção sed :

sed -n '/\begin{FOO}/,/\end{FOO}/p;
        /\begin{FOO1}/,/\end{FOO1}/p;
        /\begin{FOO2}/,/\end{FOO2}/p;' ./*.tex >> newfile.txt

onde FOO == thm, FOO1 == lem, FOO2 == prop.

    
por 29.12.2013 / 20:42
1

Você parece ter coisas desnecessariamente complicadas, se todas são linhas simples, tudo que você precisa é

sed -n '/\begin{FOO}/p' >> newfile.txt

Não sei por que você também está combinando o \end , a menos que queira excluir qualquer texto que venha depois (mas o comando sed não será).

De qualquer forma, uma maneira mais fácil seria usar apenas grep :

grep -P '\begin\{(thm|prop|lem)\}' *tex

Ou, em sed :

sed -n '/\begin{thm}/p; /\begin{prop}/p; /\begin{lem}/p' *tex

Ou Perl:

perl -ne 'print if /\begin{thm|lem|prop}/' *tex
    
por 29.12.2013 / 20:36

Tags