使用AWK

我试图用awk将两个不同的正则表达式与长字符串匹配,在35个字符的窗口中删除匹配的字符串部分。 问题是,当我寻找第一个(在beginnng上匹配)而第二个(字符串的结尾)不匹配时,同一堆代码也可以工作。 输入:

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,F)) print substr($1,RLENGTH)}' file

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

beyondlover 回答:使用AWK

考虑到您的实际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,RLENGTH)
}' Input_file
,

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

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

或对gensub()使用GNU awk:

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

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

本文链接:https://www.f2er.com/3164742.html

大家都在问