如何在 epub/mobi 文件上运行 grep?

如何在 epub/mobi 文件上运行 grep?

有没有办法做到这一点,特别是在一个目录中的一组多个 epub/mobi 文件上?

答案1

您可以通过提供-a将文件解释为 ascii 的选项来轻松 grep 这些文件:

grep -a "author" *.epub *.mobi

上述方法适用于我所有 1000 多个 EPUB 和 MOBI 文件,给出了预期的结果。

EPUB 和 MOBI 都是容器格式。 EPUB本质上是一个.zip有一些结构要求的文件,MOBI是一个Palm数据库格式文件。两种格式都允许将压缩或未压缩的数据放入容器中。

如果您要查找的数据位于容器内的“文件”中,并且该文件已压缩,您将需要提供压缩字符串不是字符串的扩展、未压缩版本。特别是,如果您在电子书阅读器上阅读 EPUB/MOBI,您通常不会grep -a 'abcde'在所有 EPUB 和 MOBI 文件上使用您刚刚阅读的单词“abcde”,因为这本书的内容很可能(但不一定,这只是容器中压缩“文件”中的一种效率措施。

这不是grep无法在这些文件中搜索的问题,而是未提供正确的搜索字符串。如果您使用某些日语到英语翻译软件读取包含日语文本的文件,然后希望能找到该文件,也会发生同样的情况英语单词通过 grep 原始文件。有了-a正确的日语(二进制)单词模式,grep就可以很好地工作。

答案2

这适用于 windows7+cygwin;搜索 zip 档案内的文本。

c:\> zipgrep "regex" file.epub    

shell 脚本位于 c:/cygwin/bin/zipgrep 中,这也有效:

c:\> unzip -p "*.epub" | grep -a --color regex

-p 用于管道。

grep-epub.sh 脚本

PAT=${1:?"Usage: grep-epub PAT *.epub files to grep"}
shift
: ${1:?"Need epub files to grep"}
for i in $* ;do
  echo $0 $i
  unzip -p $i "*.htm*" "*.xml" "*.opf" |  # unzip only html and content files to stdin
    perl -lpe 's![<][^>]{1,200}?[>]!!g;' | # get rid of small html <b>tags
    grep -Pinaso  ".{0,60}$PAT.{0,60}" | # keep some context around matches
    grep -Pi --color "$PAT"              # color the matches.
done 

答案3

epub 格式是压缩的二进制文件,因此在尝试解析文本之前必须将其解压缩。 MOBI 格式似乎也不是纯文本,所以,不,我想说 epub 和 mobi 文件不能被 grep,因为它们不是纯文本文件。使用 calibre 或其他允许文件内搜索的阅读器。

答案4

人们可以将以前的答案与 find 结合起来:

find . -name "*.epub" -exec zipgrep pattern {} \;

这样一来,人们就可以在目录树中进行搜索,从而无需所有文件都位于同一目录级别。

相关内容