2010-06-06 13 views
0

J'essaie d'écrire un script shell qui compile une source de latex. Je tiens à saisir le nom du fichier bibliographie qui est contenue dans une commande comme:Quel est le moyen le plus efficace de récupérer le nom d'une bibliographie à partir d'un fichier latex via des commandes shell Unix?

\ bibliographie {nom}

je dois sauver « nom de fichier » à une variable shell. Ma solution à ce (tcsh) est terriblement embarrassant:

set bioliography = grep -v -E "[[:blank:]]*%[[:blank:]]*" poltheory.tex | grep -E "\\bibliography{[A-Za-z0-9_\.]*}" | tail -1 | sed 's/\\bibliography//' | tr -d { | tr -d } | awk '{print $1}'

Ce se décompose comme:

  1. ne montrent pas des lignes commentées dans la source de latex
  2. grab ces lignes contenant une balise de bibliographie valide
  3. utiliser uniquement le dernier (dans le cas où, pour une raison quelconque, plusieurs sont définis)
  4. se débarrasser de la bouclée accolades
  5. définissez ce qui reste à la variable shell.

Sûrement il y a une manière élégante de faire ceci que je donne sur. Pouvez-vous m'avoir? J'ai déjà un ordre de travail, donc c'est simplement au nom de la beauté et de la magie de coquille.

Répondre

1

Règle 1: toujours écrire des scripts shell à l'aide des coquilles de la famille Bourne, et non des coquilles de la famille csh.

Il est plus facile d'extraire les informations du fichier .aux. Ici, je vais utiliser une fonctionnalité supplémentaire de bash pour couper le fichier .tex à la fin du nom de fichier:

#!/bin/sh 
texfile="$1" 
auxfile="${texfile%.tex}.aux" 

grep '^.bibdata{' "$auxfile" | sed 's/.*{//;s/}.*//' 
+0

Intéressant. Je suis sur le point de quitter mon bureau alors je ne vais pas l'essayer maintenant mais bientôt. Bonne idée. En années, je n'ai même jamais examiné le fichier aux. Cela fait plusieurs années que j'ai lu "Programmation Csh considérée comme nuisible" mais je me souviens aussi de lire quelques choses en disant que la programmation de tcsh n'est pas aussi mauvaise que l'article le suggère. –