Linux Bash - 修改从标准输出中提取的文本

Posted

技术标签:

【中文标题】Linux Bash - 修改从标准输出中提取的文本【英文标题】:Linux Bash - modifying extracted text from stdout 【发布时间】:2021-03-28 10:51:11 【问题描述】:

我想递归扫描给定目录中的所有 .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

我想从该输出中删除文件的开头和结尾,只在生成的文件中留下 EXTRACTED TEXT 以供进一步索引。

是否可以在一个 bash 命令行中完成所有这些操作?或者至少使用 bash 脚本?

【问题讨论】:

sed -n '17s/^........//;s/....$//;p;' 怎么样? @Beta 是的,像这样,谢谢。但不是字面上的提取文本,只是该字段中未知长度的任何文本 可能介于"QTime":dd, "":"", "null_metadata":[ 之间。如果我们选择sed,我需要以某种方式解决 UTF-8 问题,因为在sed 之后出现的文本是乱码,而我在上一步中就可以了 请注意,find ... -exec sh -c '......' 让您面临 shell 注入攻击;从安全的角度来看,这是一个非常糟糕的主意。使用find ... -exec sh -c 'for arg in "$@"; do ...; done' _ + 更安全,它将定位文件的名称传递给$1$2 等,而不是将文件名混入一串代码中(从而冒着文件名被解析为 代码)。 【参考方案1】:

试试这个:

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

This question 解决了 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 命令 我已经用最后的真实例子更新了我的问题 好的,我已经用sed -i 选项做到了。 你知道,如果我在文本中得到\nRE: Subject...,那么所有这些都会被剪掉 @user164863:我无法重现新错误。

以上是关于Linux Bash - 修改从标准输出中提取的文本的主要内容,如果未能解决你的问题,请参考以下文章

将所有输出重定向到 Bash 中的文件 [重复]

将 *unbuffered* 标准输出从 bash 脚本本身复制到文件

使用bash从json格式提取输出值

带你读懂bash一句话反弹shell

带你读懂bash一句话反弹shell

Linux shell Bash的基本功能2 输入输出与重定向