иеромонах Ефрем (Калинин) (am_kalinin) wrote in ru_shell,
иеромонах Ефрем (Калинин)
am_kalinin
ru_shell

Поиск совпадений в тексте

Есть текстовый файл - электронная книга.
Есть желание по ключевым словам найти в ней соответствующий параграф, а, найдя, ознакомиться по-подробней с контекстом.

=======script.sh========================

#!/bin/bash
#
## usage: script.sh book_file key_word1 [key_word2 key_word3 ...]

awk '/'$2'/&&/'$3'/&&/'$4'/&&/'$5'/&&/'$6'/&&/'$7'/ {print NR "|" $0}' $1 | pager

#
# Найденные параграфы, содержащие искомые слова пронумерованы.
# Когда мы нашли что-то заинтересовавшее нас, мы можем, выйдя из pager'а
# ввести номер этой строки, на что получим фрагмент из исходной книги,
# начинающийся пятью строками раньше найденной строки, а заканчивающийся
# пятью строками после найденной строки
#

echo -----------------------
echo Какой вариант раскрыть подробней?; read NUM
cat $1 | sed -n ''$(($NUM-5))','$(($NUM+5))'p' | pager

==============================================

а какие еще есть способы сделать то же самое?
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 11 comments
awk разве не построчно обрабатывает?
Построчно, мы этим и пользуемся.
найти в ней соответствующий параграф — параграф ведь не одна строка?
Видимо мы в определениях запутались. 8)
У меня "электронная книга" это plain-text файл, в котором каждый параграф - это строка, а между параграфами пустая строка.

Если "книга", скажем в html формате можно ее сначало заdumpить, а уже потом с ней проводить вышеозначенные операции операции.

т.е. вместо cat используем
links -dump
может быть как-то так...

cat /usr/src/linux/README | grep -B 5 -C 5 --color=auto "ON WHAT HARDWARE DOES IT RUN?"
Но как быть если помнишь только несколько слов из фразы а не всю. Например HARDWARE RUN.

Я когда с grep ковырялся чего-то так и не понял можно ли так сделать.
как нефиг делать

cat /usr/src/linux/README | grep -B 5 -C 5 --color=auto '\
[Error: Irreparable invalid markup ('<hardware.*run\>') in entry. Owner must fix manually. Raw contents below.]

как нефиг делать

cat /usr/src/linux/README | grep -B 5 -C 5 --color=auto '\<HARDWARE.*RUN\>'
хех, жж не пропарсило мой коммент. Пробую с другого клиента...

cat /usr/src/linux/README | grep -B 5 -C 5 --color=auto '\
[Error: Irreparable invalid markup ('<hardware.*run\>') in entry. Owner must fix manually. Raw contents below.]

хех, жж не пропарсило мой коммент. Пробую с другого клиента...

cat /usr/src/linux/README | grep -B 5 -C 5 --color=auto '\<HARDWARE.*RUN\>'
А если помнишь одно из слов:
cat /usr/src/linux/README | egrep -B 5 -C 5 --color=auto 'HARDWARE|Linux'
Как всё сложно и запутанно...
а чем вас не устроил просто
grep -ir -B5 -C5 '\
[Error: Irreparable invalid markup ('<hardware.*run\>') in entry. Owner must fix manually. Raw contents below.]

Как всё сложно и запутанно...
а чем вас не устроил просто
grep -ir -B5 -C5 '\<HARDWARE.*RUN\>' /usr/src/
зачем cat?
А колор сразу же в bashrc вешается.
alias grep='grep --colour'
если ищем текст и среди бинарников, то добавляем ключ -a (equivalent to --binary-files=text)
-i -игнорировать регистр (при юзании дает тормоза). -r рекурсивно по всем файлам.
Этож классика! =)