Shell-Script

從 bibtex 文件中提取選定條目的腳本

  • January 15, 2022

我有一個包含許多條目的大型 bibtex 文件,其中每個條目都有一般結構

@ARTICLE{AuthorYear,
item = {...},
item = {...},
item = {...},
etc
}

(在某些情況下ARTICLE可能是一個不同的詞,例如BOOK

我想做的是編寫一個簡單的腳本(最好只是一個 shell 腳本)來提取具有給定 AuthorYear 的條目並將它們放入一個新的 .bib 文件中。

我可以想像我可以通過 AuthorYear 辨識條目的第一句話,通過單次關閉辨識最後一句,}也許可以sed用來提取條目,但我真的不知道如何準確地做到這一點。有人可以告訴我如何實現這一目標嗎?

它可能應該是這樣的

sed -n "/AuthorYear/,/\}/p" file.bib

但是由於}條目的第一項關閉而停止,因此給出了以下輸出:

@ARTICLE{AuthorYear,
item = {...},

所以我需要辨識是否}是一行中唯一的字元,並且只有在這種情況下才停止閱讀。

以下 Python 腳本執行所需的過濾。

#!/usr/bin/python
import re

# Bibliography entries to retrieve
# Multiple pattern compilation from: http://stackoverflow.com/a/11693340/147021
pattern_strings = ['Author2010', 'Author2012',]
pattern_string = '|'.join(pattern_strings)
patterns = re.compile(pattern_string)


with open('bibliography.bib', 'r') as bib_file:
   keep_printing = False
   for line in bib_file:
       if patterns.findall(line):
           # Beginning of an entry
           keep_printing = True

       if line.strip() == '}':
           if keep_printing:
               print line
               # End of an entry -- should be the one which began earlier
               keep_printing = False

       if keep_printing:
           # The intermediate lines
           print line,

就個人而言,當過濾邏輯變得複雜時,我更喜歡使用腳本語言。這也許至少在可讀性方面具有優勢。

我建議使用經過實戰考驗的 BibTeX 庫的語言,而不是重新發明那個輪子。例如

#!/usr/bin/env perl
use strict;
use warnings;
use autodie;
use BibTeX::Parser;

open my $fh, '<', $ARGV[0];
my $parser = BibTeX::Parser->new($fh);
my @authoryear;
while (my $entry = $parser->next) {
   if ($entry->parse_ok) {
       if ($entry->key eq "AuthorYear") {
           push @authoryear, $entry;
       }
   }
   else {
       warn "Error parsing file: " . $entry->error;
   }
}

# I'm not familiar with bibtex files, so this may be insufficient
open my $out, '>', "authoryear.bib";
foreach my $entry (@authoryear) {
   say $out $entry->raw_bibtex;
}

您可能必須安裝該模組:cpan install BibTeX::Parser

引用自:https://unix.stackexchange.com/questions/105893