首页 > 解决方案 > 将字符串末尾的正则表达式与 AWK 匹配

问题描述

我正在尝试使用 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)。我不知道如何提取第二个正则表达式。

标签: awkpattern-matchingmatch

解决方案


考虑到您的实际 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

推荐阅读