Вопрос или проблема
Существует ли инструмент командной строки для текстового поиска в файле docx? Я пробовал использовать grep
, но он не работает с docx, хотя отлично работает с txt и xml файлами. Я мог бы сначала конвертировать docx в txt, но предпочел бы инструмент, работающий непосредственно с docx файлами. Мне нужно, чтобы этот инструмент работал в Cygwin.
Редактирование ОР: Позже я обнаружил, что самый простой способ выполнить grep – это на самом деле конвертировать эти docx в txt, а затем использовать grep по ним.
Мое решение с grep
в виде функции, которую можно вставить в ваш .bashrc
docx_search(){ local arg wordfile terms=() root=${root:-/}; for arg; do terms+=(-e "$arg"); done; find 2>/dev/null "${root%/}/" -iname '*.docx' -exec bash -c "$(declare -p terms)"'; for arg; do unzip -p "$arg" 2>/dev/null | grep --quiet --ignore-case --fixed-strings "${terms[@]}" && printf %s\\n "$arg"; done' _ {} +; }
Она будет искать любое (с учетом регистра) вхождение своих аргументов и выводить местоположение соответствующего файла docx.
Примеры:
$ docx_search 'my example sentence'
/cygdrive/d/example sentences.docx
/cygdrive/c/Users/my user/Documents/example sentences.docx
$ root="/cygdrive/c/Users/my user/" docx_search 'seldom' 'full sentence'
/cygdrive/c/Users/my user/Documents/example sentences.docx
$
Читаемая версия:
docx_search(){
local arg wordfile terms=() root=${root:-/}
# это присваивание ‘root’ позволяет искать в конкретном месте, например, /cygdrive/c/ вместо поиска везде на машине
for arg; do terms+=(-e "$arg"); done
# Мы внедряем термины для поиска внутри строки с помощью declare -p
find 2>/dev/null "${root%/}/" -iname '*.docx' -exec \
bash -c "$(declare -p terms)"';
for arg; do
unzip -p "$arg" 2>/dev/null |
grep --quiet --ignore-case --fixed-strings "${terms[@]}" &&
printf %s\\n "$arg"
done' _ {} +
}
Я знаю несколько инструментов индексирования, поддерживающих документы Word. Такие инструменты позволяют индексировать документы, а затем эффективно искать слова в индексе. Они не позволяют выполнять полные текстовые поиски.
- Recoll (с Antiword и WvWare). Я не уверен в поддержке Cygwin.
- Lucene, с требуются некоторые настройки. Возможно, работает на Cygwin.
- Sphinx, с любым конвертером docx-to-text. Нативно поддерживается в Windows.
- Tracker (возможно, есть некоторые проблемные моменты). Поддержка Cygwin выглядит сомнительно.
DOCx сжат и не является текстовым форматом. Таким образом, вам сначала нужен конвертер. После этого можно использовать команду find
на преобразованных файлах.
Вот обновленная версия, оптимизированная для производительности.
Требуются ripgrep
и fd-find
. Вот как их установить, если они у вас не установлены.
fd-find:
sudo apt install fd-find
ripgrep:
curl -LO https://github.com/BurntSushi/ripgrep/releases/download/13.0.0/ripgrep_13.0.0_amd64.deb
sudo apt install ./ripgrep_13.0.0_amd64.deb
Вставьте это в ваш .bashrc
:
docxgrep() {
keyword="$1"
/usr/bin/fdfind -t f -e docx . | while read -r arg; do
if unzip -p "$arg" 2>/dev/null | rg -q --ignore-case --fixed-strings "$keyword"; then
echo "$arg"
fi
done
}
Запустите source ~/.bashrc
Теперь мы можем искать:
$ docxgrep 'hello'
./Document.docx
Вы смотрели openoffice ninja?
(не знаю о поддержке cygwin)
Существует специализированная версия grep для поиска в *.docx
(и других документах Microsoft Office), *.pdf
, *.mp3
, базах данных (SQLServer, Oracle, PostgreSQL, MySQL, SQLLite, H2), метаданных изображений (*.jpg
, *.bmp
, *.png
, *.gif
, *.tiff
), Maven, сжатых файлах (*.zip
, *.tar.gz
, *.7z
и т.д.) и других файлах. Заявлено, что она выполняет рекурсивные поиски ресурсов внутри ресурсов. Требуется предварительная установка Java.
- crgrep, для Common Resource Grep
- https://sourceforge.net/projects/crgrep/
- Версия 1.0.6
- Последнее обновление: 2024-04-23
Отзывы от:
(2022) https://darrengoossens.wordpress.com/2022/09/04/crgrep-in-2022-grep-any-file-windows/
Еще одна возможность – docread, написанная на rust:
https://github.com/agoldhammer/docread
.
Ответ или решение
Для поиска текста в файлах формата DOCX с использованием командной строки под Cygwin существует несколько вариантов, включая кастомные скрипты и специализированные утилиты. Формат DOCX — это сжатые ZIP-файлы, содержащие XML-документы, поэтому работа с ними требует специфического подхода.
Решения для поиска текста в DOCX:
1. Использование bash-сценария
Встроенный bash-скрипт, который можно добавить в файл .bashrc
, позволяет осуществлять поиск по DOCX-файлам. В основе метода лежит использование утилиты unzip
для распаковки файлов и последующий поиск командой grep
.
Пример функции:
docx_search(){
local arg wordfile terms=() root=${root:-/}
for arg; do terms+=(-e "$arg"); done
find 2>/dev/null "${root%/}/" -iname '*.docx' -exec \
bash -c "$(declare -p terms)"';
for arg; do
unzip -p "$arg" 2>/dev/null |
grep --quiet --ignore-case --fixed-strings "${terms[@]}" &&
printf %s\\n "$arg"
done' _ {} +
}
2. Использование ripgrep и fd-find
Для повышения эффективности можно использовать инструменты ripgrep
и fd-find
, которые известны своей скоростью. Их необходимо предварительно установить.
Шаги установки:
sudo apt install fd-find
Установка ripgrep:
curl -LO https://github.com/BurntSushi/ripgrep/releases/download/13.0.0/ripgrep_13.0.0_amd64.deb
sudo apt install ./ripgrep_13.0.0_amd64.deb
Функция для поиска:
docxgrep() {
keyword="$1"
/usr/bin/fdfind -t f -e docx . | while read -r arg; do
if unzip -p "$arg" 2>/dev/null | rg -q --ignore-case --fixed-strings "$keyword"; then
echo "$arg"
fi
done
}
3. Специализированные инструменты
- crgrep — универсальная утилита для поиска, которая поддерживает DOCX, PDF, базы данных и многие другие форматы. Требует установки Java.
- Recoll или Lucene — мощные индексационные системы, которые можно адаптировать для работы с DOCX через конвертеры.
4. Конвертация DOCX в текст
Если перечисленные методы кажутся сложными, возможно конвертировать DOCX в текстовые файлы с помощью docx2txt
и затем применять традиционный grep
.
Заключение
Каждое из предложенных решений имеет свои преимущества и ограничения. Выбор зависит от специфики задачи, требований к скорости и простоте реализации. Надеюсь, предоставленные методы помогут вам найти оптимальное решение для поиска внутри DOCX файлов под Cygwin.