httptunnel позволяет Вам туннелировать соединение HTTP PUT
запросы. Таким образом, Вы могли использовать ssh к тому же (например, с, он ProxyCommand
), затем Вы не должны были бы жертвовать шифрованием или сервером/аутентификацией клиента.
Следующий сценарий 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->key eq "AuthorYear") {
push @authoryear, $entry;
}
}
# 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
Это - сценарий Bash, который читает каждую строку и использует соответствие regex для извлечения каждой записи, которая имеет необходимый шаблон в его голове. Можно назвать его getbibs
или что-то:
#!/usr/bin/env bash
# usage: ./getbibs pattern input.bib output.bib
while read entry; do
if [[ $entry =~ ^@.*{$1,$ ]]; then
printf "%s\n" "$entry" >> "$3"
while read item; do
[[ $item =~ ^@.*$ ]] && break
printf "%s\n" "$item" >> "$3"
done
fi
done < "$2"
Для извлечения всех записей с годом автора 1989, Вы могли сделать:
$ chmod +x ./getbibs
$ ./getbibs 1989 file.bib author.bib
Это могло бы иметь некоторые проблемы, которые я еще не протестировал, но это, кажется, работает хорошо на задачу.
Только, чтобы быть завершенным, способ, которым я выяснил меня, не столь хороший как некоторые из других, но это работает:
entries=( AuthorYear1 AuthorYear2 )
for entry in "${entries[@]}" do
sed -n "/"${entry}"/, /^ *\}/p" refs.bib
done
Это может быть выполнено от командной строки или вставило сценарий удара.
Теперь у нас также есть модуль bibparsing Python, который позволяет анализировать базы данных BibTeX с помощью Python. Например, я использую следующий скрипт для подсчета количества авторов в совместных статьях:
#!/usr/bin/python
import sys
import bibtexparser as bp
with open(sys.argv[1]) as bibtex_file:
bd = bp.load(bibtex_file)
for art in bd.entries_dict:
print("*********")
ae = bd.entries_dict[art]
print(ae[u'title'])
auths=ae[u'author'].split(" and ")
print(len(auths))
print(auths[0]+" --- "+auths[-1])