【问题标题】:How to cut the date out of a string in Shell?如何从Shell中的字符串中删除日期?
【发布时间】:2016-12-05 22:47:14
【问题描述】:

我在 .txt 文件中得到了这样的字符串列表

asdafdgdhjhgk.de/dsafdfdfgfdggfgg - Abgelaufen seit 26.11.2076 14:08 (seit 12345 Tagen)

现在我想从字符串中删除日期,例如:26.11.2076

所有这些都必须在 Shell 脚本中发生,所以我通过 cutsed 会是一个好主意,但我没有在互联网上找到答案。

【问题讨论】:

  • 你尝试了什么?你在网站上找到类似的问题吗?我相信你可以在这里找到很多。
  • (和)您只想从文件或上述字符串的单个实例中提取日期?
  • 如果日期总是在同一个字段中,您可以使用 awk 提取字段。 $ echo 'asdafdgdhjhgk.de/dsafdfdfgfdggfgg - Abgelaufen seit 26.11.2076 14:08 (seit 12345 Tagen)' | awk '{print $5}'
  • 很难从 1 的样本中推断出“像这样”的通用格式。发布几行输入和相关的预期输出以及到目前为止您尝试过的内容,请参阅How to Ask .

标签: string shell sed filtering


【解决方案1】:

您可以使用 GNU grep-E 并使用 -E, --extended-regexp 标志扩展 regEx 支持。

$ grep -Eo "[[:digit:]]{2}.[[:digit:]]{2}.[[:digit:]]{4}" <<< "asdafdgdhjhgk.de/dsafdfdfgfdggfgg - Abgelaufen seit 26.11.2076 14:08 (seit 12345 Tagen)"
26.11.2076

(或)如果您想在包含多个此类字符串的文件上运行它,请执行

$ grep -Eo "[[:digit:]]{2}.[[:digit:]]{2}.[[:digit:]]{4}" input-file

【讨论】:

  • 这不也允许32:13:2016 打印吗?
  • @PS。很公平! OP刚刚要求提取?而不是格式良好的提取。据了解,他的输入文件中的日期格式正确
  • OP 还没有告诉我们他想要什么,但这会匹配 0123456789 和其他肯定不是 OP 想要的东西(提示:. 是一个 RE 元字符)。顺便说一句,我也没有投反对票,只是说......
【解决方案2】:

如果日志/行的结构从开始到日期都相似,则可以使用以下内容:

awk '{print $5}' input

或者

grep -oP '([3][0-1]|[1-2][0-9]|[0][1-9])\.([0][0-9]|[1][0-2])\.[0-9]{4}' input

注意:这可能会在 2 月份中断。

【讨论】:

    【解决方案3】:

    谈到文本解析,我几乎总是更喜欢 Perl。

    每行多个逗号分隔的匹配项:

    perl -ne '@_=/((?:\d\d\.){2}\d{4})/g and print join(",", @_), "\n"' file
    

    每行有多个匹配项合并到一个列中:

    perl -ne 'while (/((?:\d\d\.){2}\d{4})/g) {print "$&\n";}' file
    

    第一个匹配项:

    perl -ne '/((?:\d\d\.){2}\d{4})/ and print "$1\n"' file
    

    如果日期后跟时间,则在正则表达式中添加(?: \d\d:\d\d),例如

    /((?:\d\d\.){2}\d{4})(?: \d\d:\d\d)/
    

    这将使匹配更加严格。请注意,(?:)non-capturing group

    我也喜欢grep-P 选项,它启用了与Perl 兼容的正则表达式:

    grep -o -P '(?:\d\d\.){2}\d{4}' file
    

    但有些实现可能不支持:

    这是高度实验性的, grep -P 可能会警告未实现的功能。

    grep 的手册页)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 2015-04-15
      相关资源
      最近更新 更多