寻找regExp来返回两个与pdfgrep一起使用的字符串之间的行

时间:2014-07-17 10:32:54

标签: regex bash multiline

虽然我不是全新的regExp,但他们总是让我头疼。特别是当不能使用所有形式的正则表达式时。

  • 该模式必须与pdfgrep一起使用,因为我正在寻找的信息是在pdf文档中。
  • 显然该文件是多线的
  • 如果这会产生任何差异,结果模式将用于bash脚本
  • 关键字通常可以在同一个文件中找到多次,而我只需要两个关键字首次出现之间的数据

数据如下:

some text
some more text
even more information Date
                      02.Feb.2014
                      Customer
some more text
some more information
even more information Date
                      02.Feb.2014
                      Customer
some more text
some more information
...

命令的结果应为:02.Feb.2014

我不知道这个日期可能是哪些字符(标签,空格......),我不想依赖它们。

我试过

pdfgrep -h 'Date(.*?)Customer' *.pdf

根本没有结果。

接下来尝试

pdfgrep -h '(?<=Date)(.*)(?=Customer)' *.pdf

导致错误“前面的正则表达式无效”

到目前为止我能拍到的最佳镜头是

pdfgrep -h '(Date)[[:space:]]{,1}.{,100}[[:space:]](Customer){,1}' *.pdf

这将返回所有匹配的日期以及第一个关键字。但是我想要一个更优雅的方式,因为regExp应该能够提供它。

我很感激任何有用的提示;)

此致

曼努埃尔

2 个答案:

答案 0 :(得分:0)

使用grep,awk或sed正则表达式is here时应该阅读的唯一文档。它为我清理了很多东西。

sed -n -e '/even more information Date/ {' \
       -e '    n' \
       -e '    s/^[[:space:]]*//' \
       -e '    p' \
       -e '}'

UNIX正则表达式只查看文件中的。你不能在RE中跨越线捕获东西。

上面的sed命令查找类似even more information Date的行,查看下一行,删除空格,然后打印该行(02.Feb.2014上的那一行) 。 -n选项用于抑制输出(如果“我告诉您”,则仅打印行,sed)。

答案 1 :(得分:0)

将gs与sed结合使用的提示可以解决问题。虽然我必须做一些测试,直到它按预期工作。

现在使用的命令是:

gs -q -dBATCH -dNOPAUSE -sDEVICE=txtwrite -dFirstPate=1 -dLastPage=1 \
      -sOutputFile=- /path/to/my.pdf 2>/dev/null | sed -n -e '/Date/ {' \
      -e'n' -e's/^[[:space:]]*//' -e 'p' -e '}'

感谢所有贡献者:)