awk gensub正则表达式反斜杠0和反斜杠1不工作

时间:2017-09-04 14:24:41

标签: regex bash shell awk

以下代码有效:

// {
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"等等,但我无法在此处提供多个参数。

请不要建议其他解决方案如何进行上述工作之一

1 个答案:

答案 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