иеромонах Ефрем (Калинин) (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

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

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

    Error

    default userpic

    Your IP address will be recorded 

  • 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 рекурсивно по всем файлам.
Этож классика! =)