【问题标题】:Match regexp at the end of the string with AWK将字符串末尾的正则表达式与 AWK 匹配
【发布时间】:2019-11-04 17:44:46
【问题描述】:

我正在尝试使用 awk 将两个不同的正则表达式匹配到长字符串,删除在 35 个字符窗口中匹配的字符串部分。 问题是当我寻找第一个(在开始时匹配)时,相同的一堆代码有效,而与第二个(字符串结尾)不匹配。 输入:

Regexp1(1)(2)(3)(4)(5)xxxxxxxxxxxxxxx(20)(21)(22)(23)Regexp2

期望的输出

(1)(2)(3)(4)(5)xxxxxxxxxxxxxxx(20)(21)(22)(23)

到目前为止,我使用的这段代码可以正确提取 Regexp1,但不幸的是,由于 Regexp2 的 RSTART 和 RLENGTH 索引不正确,因此也无法提取 Regexp2。 提取Regexp1的代码(正确输出):

awk -v F="Regexp1" '{if (match(substr($1,1,35),F)) print   substr($1,RSTART,RLENGTH)}' file

提取Regexp2的代码(错误输出)

awk -v F="Regexp2" '{if (match(substr($1,length($1)-35,35),F)) print substr($1,RSTART,RLENGTH)}' file

尽管 Regexp1 的索引是正确的,但 Regexp2 的索引是错误的 (RSTART=13)。我不知道如何提取第二个正则表达式。

【问题讨论】:

  • 我想你想要length($1)-35,36 你还必须从substr($1,length(..),...) 中提取substr,因为你正在匹配它,而不是$1。您的“期望输出”最容易产生误导-您的第一个代码仅打印 Regexp1 作为示例输入。第二个代码应该打印什么?你想在开头和结尾匹配一些模式吗?或者提取两个模式Regexp1Regexp2之间的数据? Regexp[12] 代表正则表达式吗,这些是纯字符串吗?
  • 我想提取匹配 Regexp1 和 Regexp2 的字符串。我想分别为 Regexp1 和 Reggexp2 执行此操作,因为我想存储 RSTART 和 RLENGTH 值。所需的输出没有与正则表达式匹配的字符串部分。
  • The desired output hasn't the - 我不明白那句话。那么,如果您的预期输出是什么,因为您清楚地已经写过您想要 Regexp1 和 Regexp2 之间的字符串 - 我相信现在您另有说明。

标签: awk pattern-matching match


【解决方案1】:

考虑到您的实际 Input_file 与显示的示例相同,如果是这种情况,请尝试以下操作(很高兴拥有 awk 的新版本,因为旧版本可能不支持正则表达式的次数逻辑)。

awk '
match($0,/\([0-9]+\){5}.*\([0-9]\){4}/){
  print substr($0,RSTART,RLENGTH)
}' Input_file

如果你的括号值的数量不固定,那么你可以这样做:

awk '
match($0,/\([0-9]+\){1,}.*\([0-9]\){1,}/){
  print substr($0,RSTART,RLENGTH)
}' Input_file

【讨论】:

    【解决方案2】:

    如果这还不是你所需要的:

    $ sed 's/Regexp1\(.*\)Regexp2/\1/' file
    (1)(2)(3)(4)(5)xxxxxxxxxxxxxxx(20)(21)(22)(23)
    

    或将 GNU awk 用于 gensub():

    $ awk '{print gensub(/Regexp1(.*)Regexp2/,"\\1",1)}' file
    (1)(2)(3)(4)(5)xxxxxxxxxxxxxxx(20)(21)(22)(23)
    

    然后编辑您的问题,使您的要求和示例更加清晰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      相关资源
      最近更新 更多