Linux Bash — изменение извлеченного текста из стандартного вывода

Я хотел бы рекурсивно сканировать данный каталог на наличие всех файлов .zip, извлекать текст из каждого такого файла с помощью Apache Tika (в моем случае это скрипт /opt/solr/bin/post) в один текстовый файл и помещать этот текстовый файл в тот же каталог, где находится оригинал zip файл есть.

Чтобы рекурсивно найти все zip-файлы и извлечь весь контент, который я использую:

find . -name "*zip" -exec sh -c 'f = "{}"; /opt/solr/bin/post "$f" \
-params = "...params..." > "$f.txt"' \;

Содержимое извлеченного файла:

java -classpath /opt/solr/dist/solr-core-8.7.0.jar -Dauto=yes -Dout=yes -
Dparams=literal.search_area=test&extractOnly=true
&extractFormat=text&defaultField=text -Dc=mycoll 
-Ddata=files org.apache.solr.util.SimplePostTool zip.zip
SimplePostTool version 5.0.0
Posting files to [base] url http://localhost:8983/solr/mycoll/update?
literal.search_area=test&extractOnly=true&extractFormat=text
&defaultField=text...
Entering auto mode. File endings considered are 
xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,
odt,odp,ods,ott,otp,ots,rtf,htm,html,txt,log
POSTing file zip.zip (application/octet-stream) to [base]/extract
{
  "responseHeader":{
    "status":0,
    "QTime":1614},
  "":"**EXTRACTED TEXT**",
 "null_metadata":[
    "stream_size",["79855"],
    "X-Parsed-By",["org.apache.tika.parser.DefaultParser",
      "org.apache.tika.parser.pkg.PackageParser"],
    "stream_content_type",["application/octet-stream"],
    "resourceName",["/mnt/remote/users/zhilov/!tmp/zip.zip"],
    "Content-Type",["application/zip"]]}
1 files indexed.
COMMITting Solr index changes to http://localhost:8983/solr/mycoll/update?
literal.search_area=test&extractOnly=true&
extractFormat=text&defaultField=text...
Time spent: 0:00:03.495

Из этого вывода я хотел бы вырезать начало и конец файла, оставив только ИЗВЛЕКАННЫЙ ТЕКСТ внутри сгенерированного файла для дальнейшего индексирования.

Возможно ли выполнить все эти операции в одной командной строке bash? Или хотя бы с помощью bash-скрипта?

Как насчет sed -n '17{s/^........//;s/....$//;p;}'?

Beta 17.12.2020 22:03

@Beta Да, что-то вроде этого, спасибо. Но не буквально ИЗВЛЕКАННЫЙ ТЕКСТ, а просто любой текст в этом поле неизвестной длины.

user164863 17.12.2020 22:49

Наверное, что-то между "QTime":dd}, "":" и ", "null_metadata":[. И если мы пойдем с sed, мне нужно будет как-то решить проблемы с UTF-8, поскольку текст, выходящий после sed, искажен, в то время как я получаю это ОК на предыдущем шаге.

user164863 17.12.2020 22:52

Обратите внимание, что find ... -exec sh -c '...{}...' открывает вас для атак с внедрением оболочки; с точки зрения безопасности это очень плохая идея. Гораздо безопаснее использовать find ... -exec sh -c 'for arg in "$@"; do ...; done' _ {} +, который передает имена найденных файлов в $1, $2 и т. д. вместо того, чтобы смешивать имя файла со строкой кода (и, таким образом, рисковать, что имя файла будет проанализировано как код).

Charles Duffy 30.06.2021 04:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это:

sed -n '/QTime/{N;s/.*\n.*:.//;s/.,$//p;}'

Этот вопрос касается проблемы UTF-8.

Это очень близко, большое спасибо. Мне пришлось добавить к этому один ", так как я получал неправильные результаты, поэтому последняя команда стала: sed -n '/QTime/{N;s/.*\n.*:".//;s/.,$//p;}'. И последнее, как я могу теперь объединить все это в одну строку? Пока что мне нужно find . -name "*zip" -exec sh -c 'f = "{}"; /opt/solr/bin/post "$f" \ -params = "...params..." > "$f.txt"' \; сохранить необработанный вывод в файл, а затем мне нужно будет снова узнать имя файла и запустить на нем вашу команду sed.

user164863 18.12.2020 13:19

Я обновил свой вопрос реальным примером в конце

user164863 18.12.2020 13:21

Хорошо, мне удалось сделать это с опцией sed -i.

user164863 18.12.2020 14:06

Знаешь, если я получу \nRE: Subject... в тексте до того, как его вырежут

user164863 18.12.2020 19:31

@ user164863: Я не могу воспроизвести новую ошибку.

Beta 19.12.2020 02:14

Другие вопросы по теме