У меня есть большой файл bibtex со многими записями, где каждая запись имеет общую структуру
@ARTICLE{AuthorYear,
item = {...},
item = {...},
item = {...},
etc
}
(в некоторых случаях это ARTICLE
может быть другое слово, например BOOK
)
То, что я хотел бы сделать, это написать простой сценарий (желательно просто сценарий оболочки) для извлечения записей с заданным AuthorYear и поместить их в новый файл .bib.
Я могу себе представить, что я могу распознать первое предложение записи AuthorYear и последнее по одному закрытию }
и, возможно, использовать sed
для извлечения записи, но я не знаю, как именно это сделать. Может кто-нибудь сказать мне, как я бы этого достиг?
Это должно быть что-то вроде
sed -n "/AuthorYear/,/\}/p" file.bib
Но это останавливается из-за закрытия }
первого элемента записи, что дает следующий вывод:
@ARTICLE{AuthorYear,
item = {...},
Поэтому мне нужно узнать, }
является ли символ в строке единственным, и «sed» перестает читать, только когда это так.
источник
sed -n "/AuthorYear/,/\}$/p"
. Обратите внимание на$
символ. Он работает нормально, за исключением того, что он не печатает закрытие}
bibitem. Кстати, использованиеsed
необходимо?sed
совсем не обязательно, я просто подумал, что это будет самый простой вариант. Я понял немного другой код:sed -n "/AuthorYear/, /^ *\}/p"
который, кажется, делает именно то, что я хочу, включая закрытие}
и исправление пробелов, если они естьОтветы:
Следующий скрипт Python выполняет желаемую фильтрацию.
Лично я предпочитаю переходить на язык сценариев, когда логика фильтрации становится сложной. Это, возможно, имеет преимущество по крайней мере по коэффициенту читабельности.
источник
{}
s. Если вы можете убедиться, что запись заканчивается\n}
, вы можете остановиться на^}
Я бы рекомендовал использовать язык с проверенной в битве библиотекой BibTeX, а не изобретать это колесо. Например
Вам, вероятно, придется установить модуль:
cpan install BibTeX::Parser
источник
Теперь у нас также есть модуль разбора Python, который позволяет анализировать базы данных BibTeX с помощью Python. Например, я использую следующий скрипт для подсчета количества авторов в совместных документах:
источник
Другой вариант - использовать bibtool.
Пример:
Проверьте руководство для конкретных случаев.
источник
Это скрипт Bash, который читает каждую строку и использует сопоставление с регулярным выражением для извлечения каждой записи, которая имеет требуемый шаблон в своей голове. Вы можете назвать это
getbibs
или что-то:Чтобы извлечь все записи с автором 1989 года, вы можете сделать:
Возможно, у меня есть некоторые проблемы, которые я еще не проверял, но, похоже, для этой задачи все в порядке.
источник
Просто чтобы быть завершенным, способ, которым я понял сам, не так хорошо, как некоторые другие, но это работает:
Его можно запустить из командной строки или поместить в скрипт bash.
источник