将字符串末尾的regexp与AWK匹配

将字符串末尾的regexp与AWK匹配,awk,pattern-matching,match,Awk,Pattern Matching,Match,我试图用awk将两个不同的Regexp与长字符串匹配,删除在35个字符窗口中匹配的字符串部分。 问题是,当我查找第一个代码(在开始时匹配)时,相同的代码组可以工作,而无法与第二个代码(字符串末尾)匹配。 输入: 期望输出 (1)(2)(3)(4)(5)xxxxxxxxxxxxxxx(20)(21)(22)(23) 到目前为止,我使用的这段代码正确地提取了Regexp1,但不幸的是,由于Regexp2的RSTART和RLENGTH的索引不正确,因此无法同时提取Regexp2。 提取Regexp1

我试图用awk将两个不同的Regexp与长字符串匹配,删除在35个字符窗口中匹配的字符串部分。 问题是,当我查找第一个代码(在开始时匹配)时,相同的代码组可以工作,而无法与第二个代码(字符串末尾)匹配。 输入:

期望输出

(1)(2)(3)(4)(5)xxxxxxxxxxxxxxx(20)(21)(22)(23)
到目前为止,我使用的这段代码正确地提取了Regexp1,但不幸的是,由于Regexp2的RSTART和RLENGTH的索引不正确,因此无法同时提取Regexp2。 提取Regexp1的代码(正确输出):

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


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

考虑到您的实际输入文件与所示示例相同,如果是这种情况,请尝试以下操作(最好有新版本的
awk
,因为旧版本可能不支持regex的次数逻辑)

如果括号值的数量不固定,则可以按如下方式操作:

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

如果这不是您所需要的全部:

$ sed 's/Regexp1\(.*\)Regexp2/\1/' file
(1)(2)(3)(4)(5)xxxxxxxxxxxxxxx(20)(21)(22)(23)
或对gensub()使用GNU awk:


然后编辑你的问题,以使你的要求和例子更加清晰。

我认为你想要
长度($1)-35,36
而且你必须从
子序列($1,长度(…)
中提取
子序列,而不是
$1
。您的“期望输出”是最容易误导的-您的第一个代码只是打印示例输入的
Regexp1
。第二个被剪掉的代码应该打印什么?您想在开头和结尾匹配一些图案吗?或者提取两个模式之间的数据
Regexp1
Regexp2
Regexp[12]
代表正则表达式吗?这些是普通字符串吗?我想提取与Regexp1和Regexp2匹配的字符串。我希望分别为Regexp1和Reggexp2执行此操作,因为我希望存储RSTART和RLENGTH值。期望的输出没有与Regexp匹配的字符串部分。
期望的输出没有
-我不理解那个句子。那么,如果您的预期输出是什么呢?因为您显然已经编写了要在Regexp1和Regexp2之间使用字符串-我相信现在您已经声明了其他情况。
awk -v F="Regexp2" '{if (match(substr($1,length($1)-35,35),F)) print substr($1,RSTART,RLENGTH)}' file
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
$ sed 's/Regexp1\(.*\)Regexp2/\1/' file
(1)(2)(3)(4)(5)xxxxxxxxxxxxxxx(20)(21)(22)(23)
$ awk '{print gensub(/Regexp1(.*)Regexp2/,"\\1",1)}' file
(1)(2)(3)(4)(5)xxxxxxxxxxxxxxx(20)(21)(22)(23)