LINUX.ORG.RU

Поиск по содержимому .doc/.odt

 ,


0

1

Привет! Есть потребность найти по строке .doc или .odt файл. Как написать портянку на баше, которая будет это делать, я приблизительно представляю. Но нужна утилита, которая умеет работать с доком (потом можно сделать вариант и для одт). Про catdoc и antiword я в курсе. Но у меня они не срабатывают. После catdoc ничего не происходит. После антиворда наблюдаю следующее: I'm afraid the text stream of this file is too small to handle

Вобщем, нужна утилита, могущая открыть док, чтобы дальше выполнить там поиск с помощью grep. Ваши идеи?

.odt и .docx это обычный zip с xml — распакуй и грепай.
С .doc которые были бинарные сложнее, но можно пересохранить в формате .docx, если catdoc не работает.

imul ★★★★★ ()
Ответ на: комментарий от Bagrov

Дополню, что у меня catdoc работает, но только на doc, а не docx. Протестировал odt2txt – тоже всё в порядке. В отличие от docx2txt, обе эти утилиты по умолчанию пишут в stdout.

Bagrov ★★★★★ ()
Ответ на: комментарий от anti_win

Нет. Stdout это стандартный поток вывода. Есть еще stderr и stdin. По названиям понятно, что это потоки для вывода «ошибок» и поток ввода.

imul ★★★★★ ()
Последнее исправление: imul (всего исправлений: 1)
Ответ на: комментарий от imul

В конечном счете все данные в памяти – это какие-то переменные. Если тут есть сишники, они могут подробно рассказать, где что хранится, какие программы какие вызовы дергают, кто куда пишет и кто откуда читает, и что именно делает bash на низком уровне, когда создает пайп.

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

Bagrov ★★★★★ ()

Выношу свой велосипед на суд народный:

#! /bin/bash

export PATH=$PATH:/bin
export IFS=$'\n'

LIST=`find $1 -name "*.docx"` 
for i in $LIST
do
if [ "`docx2txt $i -| grep -i $2`" ]
then
echo $i
fi
done

Интересует ваше мнение. Приветствуется объективная критика по существу.

anti_win ★★ ()