【发布时间】:2022-11-04 17:16:45
【问题描述】:
AWK 具有 match(s, r [, a]) 函数,根据手册,该函数能够将所有出现的模式记录到数组“a”中:
...如果提供了数组 a,则清除 a,然后用 s 中与 r 中相应的带括号的子表达式匹配的部分填充元素 1 到 n。 a 的第 0 个元素包含 s 与整个正则表达式 r 匹配的部分。下标 a[n, "start"] 和 a[n, "length"] 分别提供每个匹配子串在字符串中的起始索引和长度。
我希望以下行:
echo 123412341234 | awk '{match($0,"1",arr); print arr[0] arr[1] arr[2];)'
打印 111
但实际上“匹配”会忽略除第一个匹配之外的所有其他匹配。
请有人告诉我,用所有出现的“1”填充“arr”的正确语法是什么?
【问题讨论】:
-
(GNU)
awk在数组中存储多个匹配项的能力基于定义多个匹配模式的正则表达式(即括号内的项目);参见GNU awk string functions 和match()函数部分;特别要注意讨论的后半部分,其中样本在单个正则表达式中有 2 个带括号的模式:gawk '{ match($0, /(fo+).+(bar*)/, arr),这反过来将填充arr[]数组,匹配f0+和bar* -
要连续查找多个匹配项,使用
match(),您要么必须在正则表达式中考虑它们(例如,正则表达式中的 3x 括号模式以匹配字符串的 3x 副本),要么编写一个执行 @987654330 的循环@ 在行的连续块上
标签: awk