【发布时间】: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作为示例输入。第二个代码应该打印什么?你想在开头和结尾匹配一些模式吗?或者提取两个模式Regexp1和Regexp2之间的数据?Regexp[12]代表正则表达式吗,这些是纯字符串吗? -
我想提取匹配 Regexp1 和 Regexp2 的字符串。我想分别为 Regexp1 和 Reggexp2 执行此操作,因为我想存储 RSTART 和 RLENGTH 值。所需的输出没有与正则表达式匹配的字符串部分。
-
The desired output hasn't the- 我不明白那句话。那么,如果您的预期输出是什么,因为您清楚地已经写过您想要 Regexp1 和 Regexp2 之间的字符串 - 我相信现在您另有说明。
标签: awk pattern-matching match