【问题标题】:grep first n lines onlygrep 仅前 n 行
【发布时间】:2020-07-13 17:51:20
【问题描述】:

我在将一封信中的正确日期用作文档时遇到了问题。 原因是 grep 文档创建日期,而不是文本中的任何其他日期。

通常文件包含有关公司的信息,我的地址,客户编号,账单编号...... 以及创建日期。

可能会再次在日期内打招呼和/或文本。

文档开头的日期通常如下所示。

  1. 以 1999 年 12 月而不是 3.12.1999 为例。

如果我在模式的情况下 grep 日期

'(([0-9][0-9]{,1}\.)\s+('Januar'|'Februar'|'März'|'April'|'Mai'|'Juni'|'Juli'|'August'|'September'|'Oktober'|'November'|'Dezember')\s+([1-9][0-9][0-9][0-9]{1,}))'

有时会得到错误的日期作为创建日期。原因是文件中日期的不同写法。 示例 1 是我通常得到的,当我搜索具有正确模式的日期(创建日期)时,它工作正常。 示例 2 有问题,因为我得到了一个日期,但它不是第一个日期的创建日期。相反,我从文本中得到另一个与模式匹配的日期。

示例 1

示例 2

我可以在示例 2 中使用不同的模式 '(([0-9][0-9]{,1}\.)([0-9][0-9]{,1}\.)([1-9][0-9][0-9][0-9]{1,}))' grepping 正确的日期,但我会遇到与示例 1 相同的问题。

我的想法是仅在模式匹配取日期时才在前 n 行中搜索,否则使用不同的模式。 我没有得到pdfgrep 的规则,只使用前 n 行,这让我有可能使用不同的模式。

有人知道如何解决吗?

干杯,梦想

【问题讨论】:

  • 你有没有考虑过使用|(或)连接的两种模式?这将识别与任一模式匹配的第一个日期出现,这似乎是您想要的......
  • 用文本替换图像,然后将该输入的所需输出(无描述)添加到您的问题(无评论)。
  • @bdream :如果您在前 n 行中找到两个日期,则您将搜索限制在其中,哪一个是正确的?如果作者决定写在前 n 行之后,你如何找到日期?也许你应该在整个文档中搜索看起来像“创建日期行”的行(日期前面可能有很多空格?)并从中取出第一个,不管它在哪一行。顺便说一句,有些人写日期在文档的末尾,靠近最后的问候。
  • @hmm 你是对的 - 谢谢我可以使用pdfgrep -o --max-count 1 '(([0-9][0-9]{,1}\.)([0-9][0-9]{,1}\.)([1-9][0-9][0-9][0-9]{1,}))|('Datum:')\s+(([0-9][0-9]{,1}\.)([0-9][0-9]{,1}\.)([1-9][0-9][0-9][0-9]{1,}))|(([0-9][0-9]{,1}\.)\s+('Januar'|'Februar'|'März'|'April'|'Mai'|'Juni'|'Juli'|'August'|'September'|'Oktober'|'November'|'Dezember')\s+([1-9][0-9][0-9][0-9]{1,}))' *.pdf 找出装配日期。必须考虑如何在找到什么样的日期时切换到不同的程序部分。
  • @user1934428 你说得对,但就我而言,我有几份文件,而且我喜欢在第一页的前 1/3 内使用日期。

标签: regex bash shell grep


【解决方案1】:

使用 GNU grep:

-m NUM: 在 NUM 个匹配行之后停止读取文件。

【讨论】:

    【解决方案2】:

    替代GNU grep 学习使用GNU gawk,专为此类任务设计。

    考虑同时学习pythonGNU guile(然后阅读SICP)。

    【讨论】:

    • 完全正确!学习python不仅仅是我的清单。下一部分是将脚本传输到 python 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    相关资源
    最近更新 更多