patsplit()
基本上与在分割之前使用自定义的 SEPs
对所需的 regex
模式进行包装是相同的,这就是 anysplit()
在此处模拟的内容,同时还支持 UTF-8
。
echo "123\uC350abc:\uF8FF:|\U1F921#xyz" |
mawk2x '{ print ("\t\f"($0)"\n")>>(STDERR)
anysplit($_, reFLEX_UCode8 "|[[-_!-/3-?]",___=2,__)
OFS="\t"
for(_ in __) { if (!(_%___)) {
printf(" matched_items[ %2d ] = # %-2d = \42%s\42\n",
_,_/___,__[_])
} } } END { printf(ORS) }'
123썐abc::|#xyz
matched_items[ 2 ] = # 1 = "3썐"
matched_items[ 4 ] = # 2 = "::"
matched_items[ 6 ] = # 3 = "#"
在后台中,
anysplit()
也并不是很复杂:
xs3pFS
是一个由 \301\032\365
组成的三字节字符串,我认为即使在二进制数据中也极少出现。
gsub(patRE, xs3pFS ((pat=="&")?"\\":"") "&" xs3pFS,_)
gsub(xs3pFS "("xs3pFS")+", "",_)
return split(_, ar8, xs3pFS)
通过以这种方式拆分输入字符串,所有所需的项目将存在偶数索引中,而其余字符串将分布在奇数索引中,与gawk的split()和patsplit()中的第二个数组即第四个参数相似。但不同之处在于匹配和seps(无论您希望如何查看它们)都在同一个数组中。
当您打印出数组中的每个单元格时,您将看到:
_SEPS_[ 1 ] =
matched_items
[ 2 ] =
_SEPS_[ 3 ] =
matched_items
[ 4 ] =
_SEPS_[ 5 ] =
matched_items
[ 6 ] =
_SEPS_[ 7 ] =
awk
能够将多个匹配结果存储在一个数组中,这取决于正则表达式定义的多个匹配模式(即,括号内的项);请参见GNU awk 字符串函数和match()
函数的相关部分;特别是要注意讨论的后半部分,其中示例在单个regex中有2个带括号的模式:gawk '{ match($0, /(fo+).+(bar*)/, arr)
,这反过来将使用f0+
和bar*
的匹配结果填充arr[]
数组。 - markp-fusomatch()
函数,但需要在正则表达式中考虑到它们(例如,在正则表达式中添加3个括号模式以匹配3个字符串副本),或编写一个循环,在行的连续块上执行match()
函数。 - markp-fuso