Mam duży plik bibtex z wieloma wpisami, z których każdy ma ogólną strukturę
@ARTICLE{AuthorYear,
item = {...},
item = {...},
item = {...},
etc
}
(w niektórych przypadkach ARTICLE
może to być inne słowo np. BOOK
)
Chciałbym napisać prosty skrypt (najlepiej skrypt powłoki), aby wyodrębnić wpisy o podanym AuthorYear i umieścić je w nowym pliku .bib.
Mogę sobie wyobrazić, że potrafię rozpoznać pierwsze zdanie wpisu AutorYeara i ostatnie po pojedynczym zamknięciu }
i być może użyć go sed
do wyodrębnienia wpisu, ale tak naprawdę nie wiem, jak to zrobić dokładnie. Czy ktoś może mi powiedzieć, jak to osiągnę?
Prawdopodobnie powinno to być coś w rodzaju
sed -n "/AuthorYear/,/\}/p" file.bib
Ale to zatrzymuje się z powodu zamknięcia }
w pierwszym elemencie wpisu, co daje ten wynik:
@ARTICLE{AuthorYear,
item = {...},
Muszę więc rozpoznać, czy }
jest to jedyny znak w wierszu i czy „sed” przestaje czytać, gdy tak jest.
źródło
sed -n "/AuthorYear/,/\}$/p"
. Zwróć uwagę na$
symbol. Działa dobrze, z tym wyjątkiem, że nie drukuje zamknięcia}
bibitemu. Btw, czy użycie jestsed
konieczne?sed
wcale nie jest konieczne, pomyślałem, że będzie to najłatwiejsza opcja. Wymyśliłem nieco inny kod:sed -n "/AuthorYear/, /^ *\}/p"
który wydaje się robić dokładnie to, co chcę, w tym zamykanie}
i korygowanie spacji, jeśli takie istniejąOdpowiedzi:
Poniższy skrypt w języku Python wykonuje wymagane filtrowanie.
Osobiście wolę przejście na język skryptowy, gdy logika filtrowania staje się złożona. Być może ma to przynajmniej zaletę w zakresie współczynnika czytelności.
źródło
{}
s. Jeśli możesz upewnić się, że wejście się skończy\n}
, możesz zatrzymać się na^}
Polecam użycie języka z przetestowaną w bitwie biblioteką BibTeX zamiast odkrywania tego koła. Na przykład
Prawdopodobnie będziesz musiał zainstalować moduł:
cpan install BibTeX::Parser
źródło
Teraz mamy również moduł bibparsing Pythona, który pozwala analizować bazy danych BibTeX za pomocą Pythona. Na przykład używam następującego skryptu, aby obliczyć liczbę autorów we wspólnych pracach:
źródło
Inną opcją byłoby użycie bibtoola.
Przykład:
Zapoznaj się z instrukcją dla konkretnych przypadków.
źródło
Jest to skrypt Bash, który odczytuje każdą linię i używa dopasowania wyrażenia regularnego do wyodrębnienia każdego wpisu, który ma wymagany wzorzec w głowie. Możesz to nazwać
getbibs
lub coś takiego:Aby wyodrębnić wszystkie wpisy z autorem roku 1989, możesz:
Mogą występować pewne problemy, których jeszcze nie przetestowałem, ale wydaje się, że działają dobrze dla tego zadania.
źródło
Żeby być kompletnym, sposób, w jaki sam się zorientowałem, nie jest tak miły jak niektóre inne, ale działa:
Można go uruchomić z wiersza polecenia lub umieścić w skrypcie bash.
źródło