2015-12-10 47 views
0

仅供参考,我是一个awk/gsub noob。awk/gsub - 显示字符串之前,然后之前,然后之前gsub

我有一个SVN转储我想要创建,格式users.txt ...

user.name = user name <[email protected]> 

这里就是我得...

awk '/svn:author/ { getline; getline; gsub("[\.]", " ", $1); print $0, " = ", $1 , " <", $0, "@foo.com>"}' svn_dmp | sort | uniq 

不幸的是,它正在改变$0值,并移除所有.,所以我得到...

mr foo = mr foo <mr [email protected]> 

我希望gsub会将新字符串写入$1并保留$0。如何仅在中间的mr.foo中交换点的空间?

+0

'$ 0'是整条生产线,其中包括'$ 1',所以当你改变'$ 1'你改变的'$ 0'这部分也是如此。 – jas

+2

在使用它之前,请务必阅读并完全理解关于getline的所有警告和gothcas,然后通常您不会。无论如何,你的问题不需要getline,你使用它的方式是错误的。发布几行样本输入和预期输出,我们可以帮助您。 –

回答

2

$0是整行,其中包括$1,所以当您更改$1时,您也正在更改$0的那一部分。如果您想保留原始$0,则需要在修改$1之前将其保存在另一个变量中。

喜欢的东西

$ echo 'mr.foo' | awk '{orig=$0 
         gsub("[\.]", " ", $1) 
         print orig " = " $1 " <" orig "@foo.com>"}' 

mr.foo = mr foo <[email protected]>