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”的正确语法是什么?
match只找到第一个匹配并停在那里。您将必须match在循环中运行,否则使用这种方式,我们对任何不是这样的东西使用分割输入1:
echo '123412341234' | awk -F '[^1]+' '{print $1 $2 $3}'
111
Run Code Online (Sandbox Code Playgroud)
或者在 gnu-awk 中使用split:
echo '123412341234' | awk -F '[^1]+' '{print $1 $2 $3}'
111
Run Code Online (Sandbox Code Playgroud)