1. tengucrow
  2. bible

Overview

2013-03-27 20:28

Библия в формате удобном для grep

Уже давно хочу написать заметку "Гугл, который всегда с тобой" - о том, что несколько плейн-текстовых словарей и энциклопедий на диске плюс два-три алиаса и самое-самое приблизительное понимание работы grep вполне заменяю интернет. Во всяком случае, когда нужно быстро получить короткую справку - для меня быстрее вбить в консоли нужный запрос, чем ждать пока откроется гугл, пока он соизволит вывалить мне ворох ссылок, а потом фильтровать эти ссылки от рекламного и оптимизаторского мусора.

В общем здесь лежит файл Библии, который можно использовать для грепов.

Можно искать, как по словам:

vik@kit:~/enc$ grep мехи bible.txt
Нав 9:4 употребили хитрость: пошли, запаслись хлебом на дорогу и положили ветхие мешки на ослов своих и ветхие, изорванные и заплатанные мехи вина;
Нав 9:13 и эти мехи с вином, которые мы налили новые, вот, изорвались; и эта одежда наша и обувь наша обветшала от весьма дальней дороги.
Мф 9:17 Не вливают также вина молодого в мехи ветхие; а иначе прорываются мехи, и вино вытекает, и мехи пропадают, но вино молодое вливают в новые мехи, и сберегается то и другое.
Мк 2:22 Никто не вливает вина молодого в мехи ветхие: иначе молодое вино прорвет мехи, и вино вытечет, и мехи пропадут; но вино молодое надобно вливать в мехи новые.
Лк 5:37 И никто не вливает молодого вина в мехи ветхие; а иначе молодое вино прорвет мехи, и само вытечет, и мехи пропадут;
Лк 5:38 но молодое вино должно вливать в мехи новые; тогда сбережется и то и другое.

Так и по отдельным главам и стихам:

vik@kit:~/enc/bible$ grep Псал\ 90 bible.txt 
Псал 90:[Хвалебная песнь Давида.]
Псал 90:1 Живущий под кровом Всевышнего под сенью Всемогущего покоится,
Псал 90:2 говорит Господу: "прибежище мое и защита моя, Бог мой, на Которого я уповаю!"
Псал 90:3 Он избавит тебя от сети ловца, от гибельной язвы,
Псал 90:4 перьями Своими осенит тебя, и под крыльями Его будешь безопасен; щит и ограждение - истина Его.
Псал 90:5 Не убоишься ужасов в ночи, стрелы, летящей днем,
Псал 90:6 язвы, ходящей во мраке, заразы, опустошающей в полдень.
Псал 90:7 Падут подле тебя тысяча и десять тысяч одесную тебя; но к тебе не приблизится:
Псал 90:8 только смотреть будешь очами твоими и видеть возмездие нечестивым.
Псал 90:9 Ибо ты _сказал:_ "Господь - упование мое"; Всевышнего избрал ты прибежищем твоим;
Псал 90:10 не приключится тебе зло, и язва не приблизится к жилищу твоему;
Псал 90:11 ибо Ангелам Своим заповедает о тебе - охранять тебя на всех путях твоих:
Псал 90:12 на руках понесут тебя, да не преткнешься о камень ногою твоею;
Псал 90:13 на аспида и василиска наступишь; попирать будешь льва и дракона.
Псал 90:14 "За то, что он возлюбил Меня, избавлю его; защищу его, потому что он познал имя Мое.
Псал 90:15 Воззовет ко Мне, и услышу его; с ним Я в скорби; избавлю его и прославлю его,
Псал 90:16 долготою дней насыщу его, и явлю ему спасение Мое".

Список обозначений тоже можно получить по грепу:

vik@firefly:~/bible$ grep '==' bible.txt 
== Старый Завет
Быт     ==      Бытие 
Исх     ==      Исход 
Лев     ==      Левит 
Числ    ==      Числа 
Втор    ==      Второзаконие 
Нав     ==      Книга Иисуса Навина 
Суд     ==      Книга Судей израилевых 
Руф     ==      Книга Руфи 
1Цар    ==      Первая книга Царств 
2Цар    ==      Вторая книга Царств 
3Цар    ==      Третья книга Царств 
4Цар    ==      Четвертая книга Царств 
1Пар    ==      Первая книга Паралипоменон 
Неем    ==      Книга Неемии 
2Езд    ==      Вторая книга Ездры 
Товит   ==      Книга Товита 
Иудифь  ==      Книга Иудифи 
Есф     ==      Книга Есфири 
Иов     ==      Книга Иова 
Псал    ==      Псалтирь 
Прит    ==      Притчи Соломона 
Еккл    ==      Книга Екклезиаста 
Песнь   ==      Песнь песней Соломона 
Прем    ==      Книга Премудрости Соломона 
Сирах   ==      Книга Премудрости Иисуса, сына Сирахова 
Ис      ==      Книга пророка Исаии 
Иер     ==      Книга пророка Иеремии 
Плач    ==      Плач Иеремии 
ПослИер ==      Послание Иеремии 
Вар     ==      Книга пророка Варуха 
Иез     ==      Книга пророка Иезекииля 
Дан     ==      Книга пророка Даниила 
Ос      ==      Книга пророка Осии 
Иоил    ==      Книга пророка Иоиля 
Ам      ==      Книга пророка Амоса 
Авд     ==      Книга пророка Авдия 
Ион     ==      Книга пророка Ионы 
Мих     ==      Книга пророка Михея 
Наум    ==      Книга пророка Наума 
Ав      ==      Книга пророка Аввакума 
Соф     ==      Книга пророка Софонии 
Аг      ==      Книга пророка Аггея 
Зах     ==      Книга пророка Захарии 
Мал     ==      Книга пророка Малахии 
1Мак    ==      Первая книга Маккавейская 
2Мак    ==      Вторая книга Маккавейская 
3Мак    ==      Третья книга Маккавейская 
3Езд    ==      Третья книга Ездры 
== Новый Завет
Мф      ===     От Матфея святое благовествование 
Мк      ===     От Марка святое благовествование 
Лк      ===     От Луки святое благовествование 
Ин      ===     От Иоанна святое благовествование 
Деян    ===     Деяния святых апостолов 
Иак     ===     Соборное послание святого апостола Иакова 
1Пет    ===     Первое соборное послание святого апостола Петра 
2Пет    ===     Второе соборное послание святого апостола Петра 
1Ин     ===     Первое соборное послание святого апостола Иоанна 
2Ин     ===     Второе соборное послание святого апостола Иоанна 
3Ин     ===     Третье соборное послание святого апостола Иоанна 
Иуд     ===     Соборное послание святого апостола Иуды 
Рим     ===     Послание к Римлянам святого апостола Павла 
1Кор    ===     Первое послание к Коринфянам святого апостола Павла 
2Кор    ===     Второе послание к Коринфянам святого апостола Павла 
Гал     ===     Послание к Галатам святого апостола Павла 
Еф      ===     Послание к Ефесянам святого апостола Павла 
Фил     ===     Послание к Филиппийцам святого апостола Павла 
Кол     ===     Послание к Колоссянам святого апостола Павла 
1Фес    ===     Первое послание к Фессалоникийцам (Солунянам) святого апостола Павла 
2Фес    ===     Второе послание к Фессалоникийцам (Солунянам) святого апостола Павла 
1Тим    ===     Первое послание к Тимофею святого апостола Павла 
2Тим    ===     Второе послание к Тимофею святого апостола Павла 
Тит     ===     Послание к Титу святого апостола Павла 
Флм     ===     Послание к Филимону святого апостола Павла 
Евр     ===     Послание к Евреям святого апостола Павла 
Откр    ===     Откровение святого Иоанна Богослова

2011-06-24 23:35

Пусть будет тут.

Мне понадобилось переделать Библию так, чтобы по поиску получать нужные координаты (и наоборот - по книге-главе-стиху получать нужные строчки). Для этого я решил в каждой строке приписать ее условное обозначение в формате:

Сокр гл:стих

Например:

Псал 90:10 не приключится тебе зло, и язва не приблизится к жилищу твоему;

Что было сделано? В википедии нашел список условных обозначений - принял их за исходный. Восточный стиль в этом смысле очень удобен.

Вручную привел Библию к виду где # обозначает книгу, а ## главу (было несложно - заменил в исходнике = на # и еще немного поработал регэкспами).

Заменил названия книг на их сокращения - тупо искал /^# и менял, сверяясь с википедией.

Написал короткий скрипт на Питоне (показалось проще всего реализовать):

#! /usr/bin/python
# -*- coding: utf8 -*-
# Расставляем стихи в Библии

import sys
tm = 'bible_index.txt'

# открываем файл и считываем оттуда текст

fh = open(tm,'rb')
line = fh.readlines()
fh.close()

cur_book = '' # название текущей книги
cur_chap = '' # номер текущей главы 
s = ''
new = []

for i in line:
    if i[0] == '#' and i[1] == ' ':
        cur_book = i[2:].strip()
        new.append(i)
    if i[0] == '#' and i[1] == '#':
        cur_chap = i[3:].strip()
        new.append(i)
    if i[0]!=' ' and i[0]!='#':
        s = cur_book+' '+cur_chap+':'+i
        new.append(s)
for i in new:
    print i

Прочее было делом техники.

Получил новый текст:

python python.py > bible_st.txt

Теперь:

Bible.txt - полные названия книг
bible_index.txt - условные обозначения вместо названий книг
bible_st.txt - уже расставлены стихи

Собрал вместе заголовки и их условные обозначения.

sed -n '/^# /p' bible_index.txt > us.txt
sed -n '/^# /p' Bible.txt > us2.txt

Свел их вместе:

paste us.txt us2.txt > uss.txt

paste - построчно сшивает файлы. Очень удобная утилита. Полученный файл допилил напильником в виме. Получил готовую легенду для исходной Библии.

Удалил заголовки:

sed '/^# /d' bible_index.txt > bible2.txt

И "лишние" обозначения глав и книг - чтобы оставить только стихи.

sed '/[0-9]:$/d' bible2.txt > bible3.txt
sed '/:$/d' bible3.txt > bible4.txt

Поисковые нюансы.

Можно делать интересные подсчеты. Даже раздельно - в Ветхом и Новом Заветах

vik@frakir:~/dic$ sed -n '1,/^Мф/p' bible.txt | gr любовь | wc
     29     594    6128
vik@frakir:~/dic$ sed -n '/^Мф/,$p' bible.txt | gr любовь | wc
     51     899    8980
vik@frakir:~/dic$ sed -n '/^Мф/,$p' bible.txt | gr любовь -c
51
vik@frakir:~/dic$ sed -n '1,/^Мф/p' bible.txt | gr любовь -c
29

2012-05-29 13:21

Продолжение истории. Где-то прозевал регэксп - пришлось переделывать часть заново - хорошо, что сохранил архивы.

Теперь я сначала смотрел что делает тот или другой регэксп, потом уже "пускал его в дело":

sed -n '/ [0-9]:$/p' bible_fullst.txt
sed '/ [0-9]:$/d' bible_fullst.txt > bible_2.txt

sed -n '/[0-9][0-9]:$/p' bible_2.txt
sed '/[0-9][0-9]:$/d' bible_2.txt > bible_3.txt

Вывод подавляется -n, сам регэксп печатается p, потом все меняется на d - дабы удалить его из.

sed -n '/^# /p' bible_3.txt 
sed '/^# /d' bible_3.txt 
sed '/^# /d' bible_3.txt > bible_4.txt

sed '/^## /d' bible_4.txt > bible_5.txt

Дальше возникла идея посчитать - все ли я сделал хорошо?

Смысл - показать вручную все стихи и посчитать количество строк - номер последнего стиха и количество строк должны совпадать.

gr "Мф 15" bible_5.txt 
gr "Мф 15" bible_5.txt  |wc
gr "Мф 1:" bible_5.txt  |wc
gr "Мф 1:" bible_5.txt

gr "Мф 2:" bible_5.txt  
gr "Мф 2:" bible_5.txt  |wc

Быстро надоело вручную каждый раз добавлять |wc.

gr "Мф 2:" bible_5.txt  |tee file |wc && tail file
gr "Мф 3:" bible_5.txt  |tee file |wc && tail file

Пришло в голову, что можно сделать вывод равным одной строке:

gr "Мф 3:" bible_5.txt  |tee file |wc && tail -n 1file
gr "Мф 3:" bible_5.txt  |tee file |wc && tail -n 1 file
gr "Мф 4:" bible_5.txt  |tee file |wc && tail -n 1 file
gr "Мф 5:" bible_5.txt  |tee file |wc && tail -n 1 file

Захотелось совсем полной автоматизации. Залез в интернеты почитал про for do done

http://www.cyberciti.biz/faq/bash-for-loop/

На самом деле все просто

for i in 1 2 3 4 5
    do
        ....
        echo $i
    done

Этого оказалось мало. Понадобились однострочники

http://penguinpetes.com/b2evo/index.php?p=215

http://zeth.net/post/536/ полезные трюки!

http://www.bashoneliners.com/

В одну строчку оно будет разделено ;:

for i in 1 2 3 4 5; do .... $i .... ; done

for i in 1 2 3 4 5; do gr "Мф $i:" bible_5.txt  |tee file |wc && tail -n 1 file; done

А как задать интервал? Через {1..30}, например:

for i in {1..30}; do gr "Мф $i:" bible_5.txt  |tee file |wc && tail -n 1 file; done

И, наконец, захотелось чтобы строки разделялись:

for i in {1..30}; do gr "Мф $i:" bible_5.txt  |tee file |wc && tail -n 1 file && echo ''; done
for i in {1..30}; do gr "Мк $i:" bible_5.txt  |tee file |wc && tail -n 1 file && echo ''; done