我认为 gawk match()-to-array 仅适用于捕获组的第一个实例。
如果您想要捕获多个事物,并对它们执行任何复杂的操作,也许
gawk 'BEGIN { S = SUBSEP
} {
nx=split(gensub(/(..(..)..(..))/,
"\\1"(S)"\\2"(S)"\\3", "g", str),
arr, S)
for(x in nx) { perform-ops-over arr[x] } }'
这样您就不会受到gensub() 或match() 的限制,这会限制您的修改的复杂性。
通过纯粹的反复试验,我注意到关于 unicode 模式下的 gawk 的一个警告:对于一个有效的 unicode 字符串 뀇꿬 以及下面列出的 6 个八进制代码:
场景 1:匹配单个字节没问题,但也会向您报告 1 的多字节 RSTART 而不是 2 的字节级答案。它也不会提供有关是否 \207 是第一个连续字节,或者是第二个字节,因为 RLENGTH 在这里总是为 1。
$ gawk 'BEGIN{ print match("\353\200\207\352\277\254", "\207") }'
$ 1
场景 2:Match 也适用于像这样的 unicode-invalid 模式
$ gawk 'BEGIN{ match("\353\200\207\352\277\254", "\207\352");
$ print RSTART, RLENGTH }'
$ 1 2
场景 3:您可以检查是否存在针对 unicode 非法字符串的模式(\300 \xC0 对于所有可能的字节对都是 UTF8 无效的)
$ gawk 'BEGIN{ print ("\300\353\200\207\352\277\254" ~ /\200/) }'
$ 1
场景 4/5/6:错误消息将显示在 (a) match() 的 unicode-invalid 字符串,index() 的任一参数为 unicode-invalid/incomplete。
$ gawk 'BEGIN{ match("\300\353\200\207\352\277\254", "\207\352"); print RSTART, RLENGTH }' gawk: cmd. line:1: warning: Invalid multibyte data detected. There may be a mismatch between your data and your locale. 2 2
$ gawk 'BEGIN{ print index("\353\200\207\352\277\254", "\352") }' gawk: cmd. line:1: warning: Invalid multibyte data detected. There may be a mismatch between your data and your locale. 0
$ gawk 'BEGIN{ print index("\353\200\207\352\277\254", "\200") }' gawk: cmd. line:1: warning: Invalid multibyte data detected. There may be a mismatch between your data and your locale. 0