Tengo un archivo bibtex grande con muchas entradas donde cada entrada tiene la estructura general
@ARTICLE{AuthorYear,
item = {...},
item = {...},
item = {...},
etc
}
(en algunos casos ARTICLE
podría ser una palabra diferente, por ejemplo BOOK
)
Lo que me gustaría hacer es escribir un script simple (preferiblemente solo un script de shell) para extraer entradas con AuthorYear dado y ponerlas en un nuevo archivo .bib.
Me imagino que puedo reconocer la primera oración de una entrada por AuthorYear y la última por el cierre único }
y tal vez usar sed
para extraer la entrada, pero realmente no sé cómo hacer esto exactamente. ¿Alguien puede decirme cómo lograría esto?
Probablemente debería ser algo como
sed -n "/AuthorYear/,/\}/p" file.bib
Pero eso se detiene debido al cierre }
en el primer elemento de la entrada, dando así esta salida:
@ARTICLE{AuthorYear,
item = {...},
Por lo tanto, necesito reconocer si }
es el único carácter en una línea y solo he dejado de leer cuando este es el caso.
fuente
sed -n "/AuthorYear/,/\}$/p"
. Tenga en cuenta el$
símbolo. Funciona bien, excepto que no imprime el cierre}
de un bibitem. Por cierto, ¿essed
necesario el uso de ?sed
no es necesario en absoluto, solo pensé que sería la opción más fácil. He descubierto un código ligeramente diferente:sed -n "/AuthorYear/, /^ *\}/p"
que parece hacer exactamente lo que quiero, incluido el cierre}
y la corrección de espacios si hay algunoRespuestas:
El siguiente script de Python realiza el filtrado deseado.
Personalmente, prefiero pasar a un lenguaje de secuencias de comandos cuando la lógica de filtrado se vuelve compleja. Eso, tal vez, tiene una ventaja en el factor de legibilidad al menos.
fuente
{}
s anidados . Si puede asegurarse de que la entrada termine con\n}
, puede parar con^}
Recomendaría usar un lenguaje con una biblioteca BibTeX probada en batalla en lugar de reinventar esa rueda. Por ejemplo
Probablemente tendrá que instalar el módulo:
cpan install BibTeX::Parser
fuente
Ahora también tenemos el módulo bibparsing de Python, que permite analizar bases de datos BibTeX con Python. Por ejemplo, utilizo el siguiente script para calcular el número de autores en artículos de colaboración:
fuente
Otra opción sería usar bibtool.
Ejemplo:
Consulte el manual para casos específicos.
fuente
Este es un script Bash que lee cada línea y utiliza la coincidencia de expresiones regulares para extraer cada entrada que tiene el patrón requerido en su cabeza. Puedes llamarlo
getbibs
o algo así:Para extraer todas las entradas con un año de autor de 1989, puede hacer:
Puede tener algunos problemas que aún no he probado, pero parece funcionar bien para la tarea.
fuente
Para ser completos, la forma en que me di cuenta, no es tan agradable como algunos de los otros, pero funciona:
Se puede ejecutar desde la línea de comandos o poner en un script bash.
fuente