我想知道以下行为是否可靠:
echo 😄 | gawk '{split($0,array,"."); print array[1] length(array);}'
输出为:😄1
对比
echo 😄 | gawk '{patsplit($0,array,"."); print array[1] length(array);}'
输出为:�4
patsplit
是在字节上工作还是split
在字符上工作,但我没有在任何地方找到关于此的文档或讨论。问题是,我可以依赖这种行为吗?在哪里?
这是因为
split
和patsplit
是根本不同的函数。split
通过字段分隔符(即字段之间的内容)将字符串划分为字段,而patsplit
通过将字段本身与字段模式进行匹配将字符串划分为字段。根据文档,所有 gawk 函数(包括
split
和patsplit
)都适用于与语言环境相关的字符,而不是字节。此外,作为字段分隔符的单字符串
"."
将按字面意思处理,而不是按正则表达式模式处理(请参阅 的文档FS
)。.
由于😄的输入字符串中没有,当您split
以"."
作为字段分隔符调用时,split
只会看到 1 个字段。并且由于😄由 4 个字节组成,并且大概您已将语言环境设置为基于字节的语言环境(例如)
C
,当您patsplit
使用"."
作为字段模式调用时,每个.
匹配😄的一个字节,从而产生一个大小为 4 的数组。