2017-09-04 212 views
0

下面的代码工作:AWK gensub正则表达式反斜杠0和反斜杠1不灵

// { 
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

您使用“智能引号”(),而不是在地方实际报价("),和awk反向引用是\\1等,而不仅仅是\1。第一个参数gensub是一个正则表达式不是字符串,所以使用正则表达式分隔符/.../而不是字符串分隔符"..."(后者会导致双重解析,这会产生负面影响 - 请参见手册页)。摆脱//,因为他们绝对不会干扰你的代码。最后 - 为了便携性和健壮性,使用字符类[[:lower:]][[:upper:]]而不是范围[a-z][A-Z]

$ echo 'EdMorton' | awk '{print gensub(/([[:lower:]])([[:upper:]])/,"\\1 \\2",1)}' 
Ed Morton 
+0

如何更改智能报价和真实报价?你是如何认识诸如\\而不是\?的东西的? –

+0

idk人们如何创造“聪明的引号”(我从你的问题复制/粘贴),但我认为这是有关使用一些编辑器(可能是Windows的?),所以也许找到一个不同的编辑器(我使用' vi')?同样,我也了解其他一切 - 阅读文档和经验。 FWIW我强烈推荐Arnold Robbins编写的Effective Awk Programming第4版 - 如果你有任何其他的awk书,那么就把它扔掉。 –

+0

也是关于向gensub提供超过1个目标的问题。你能解决这个问题吗?我不知道你在说什么要摆脱//?我的代码在没有它们的情况下工 –