Eu tenho um arquivo bibtex grande com muitas entradas em que cada entrada tem a estrutura geral
@ARTICLE{AuthorYear,
item = {...},
item = {...},
item = {...},
etc
}
(em alguns casos, ARTICLE
pode ser uma palavra diferente, por exemplo BOOK
)
O que eu gostaria de fazer é escrever um script simples (de preferência apenas um script shell) para extrair entradas com o AuthorYear fornecido e colocá-las em um novo arquivo .bib.
Posso imaginar que reconheço a primeira frase de uma entrada por AuthorYear e a última pelo fechamento único }
e talvez use sed
para extrair a entrada, mas não sei exatamente como fazer isso exatamente. Alguém pode me dizer como eu conseguiria isso?
Provavelmente deveria ser algo como
sed -n "/AuthorYear/,/\}/p" file.bib
Mas isso é interrompido devido ao fechamento }
do primeiro item da entrada, fornecendo assim esta saída:
@ARTICLE{AuthorYear,
item = {...},
Então, eu preciso reconhecer se esse }
é o único caractere em uma linha e apenas 'sed' para de ler quando esse for o caso.
fonte
sed -n "/AuthorYear/,/\}$/p"
. Observe o$
símbolo. Funciona bem, exceto que não imprime o fechamento}
de um bibitem. Aliás, ésed
necessário o uso de ?sed
não é necessário, eu apenas pensei que seria a opção mais fácil. Eu descobri um código um pouco diferente: osed -n "/AuthorYear/, /^ *\}/p"
que parece fazer exatamente o que eu quero, incluindo o fechamento}
e a correção de espaços, se houver algum.Respostas:
O script Python a seguir faz a filtragem desejada.
Pessoalmente, prefiro mudar para uma linguagem de script quando a lógica de filtragem se tornar complexa. Talvez isso tenha uma vantagem no fator de legibilidade, pelo menos.
fonte
{}
s aninhados . Se você puder garantir que a entrada termine com\n}
, poderá parar com^}
Eu recomendaria o uso de uma linguagem com uma biblioteca BibTeX testada em batalha, em vez de reinventar a roda. Por exemplo
Você provavelmente terá que instalar o módulo:
cpan install BibTeX::Parser
fonte
Agora também temos o módulo de bibparsing Python, que permite analisar bancos de dados BibTeX com Python. Por exemplo, eu uso o seguinte script para calcular o número de autores em trabalhos colaborativos:
fonte
Outra opção seria usar o bibtool.
Exemplo:
Confira o manual para casos específicos.
fonte
Este é um script Bash que lê cada linha e usa a correspondência de regex para extrair cada entrada que possui o padrão necessário em sua cabeça. Você pode chamá-lo
getbibs
ou algo assim:Para extrair todas as entradas com um ano de autor de 1989, você pode fazer:
Pode ter alguns problemas que ainda não testei, mas parece funcionar bem para a tarefa.
fonte
Apenas para ser completo, do jeito que eu descobri, não tão legal quanto alguns dos outros, mas funciona:
Pode ser executado a partir da linha de comando ou inserido em um script bash.
fonte