以下代码有效:
// {
print gensub("[a-z][A-Z]”,"&","g")
}
但这不是:
// {
print gensub("[a-z][A-Z]","\0","g")
}
这也不是我想要实现的目标:
// {
print gensub(“([a-z])([A-Z])",”\1 \2","g")
}
为什么这不起作用,我该如何工作呢?这个脚本的目标:名称的姓氏不以空格分隔,我需要将它们分开。名字的第一个字符是大写字母,我不希望在名字前面有空格。我可以将FS
设置为''
并检查每个字符,但我想学习gensub。我也没有找到gsub的使用,因为它给了我匹配的数量,而不是替换后的字符串。
另一种可能的解决方案,但我不知道如何使这项工作是将gensub中的目标从"g"
设置为"2,3,4"
等等,但我无法在此处提供多个参数。
请不要建议其他解决方案如何进行上述工作之一
答案 0 :(得分:0)
您正在使用"智能报价" (”
)而不是真实的引号("
),而awk反向引用是\\1
等,而不仅仅是\1
。另外,gensub的第一个arg是regexp而不是字符串,所以使用regexp delimiters /.../
而不是字符串分隔符"..."
(后者导致双解析,这会产生负面影响 - 请参阅手册页)。摆脱//
,因为它们绝对没有任何东西,只会弄乱你的代码。最后 - 使用字符类[[:lower:]]
和[[:upper:]]
代替范围[a-z]
和[A-Z]
,以实现可移植性和健壮性。
$ echo 'EdMorton' | awk '{print gensub(/([[:lower:]])([[:upper:]])/,"\\1 \\2",1)}'
Ed Morton