2016-09-20 61 views
0

我想要awk改变给定的模式,如果匹配或返回原来的行。这里是我的代码awk条件是否匹配模式

printf 'hello,"hru, bro"\nhi,bye\n' | gawk 'match($0, /"([^"]+)"/, m) {if (m[1] == "") {print $0} else {print gsub(/,/,"",m[1])}}' 

-> 1 

我希望'匹配以米为m返回匹配模式[1]和GSUB替换所有“” [1]时,有一个匹配。因此结果应该是

-> hello,hru bro\nhi,bye 

我在这里错过了什么?

UPDATE

据汤姆评论我gensub取代gsub,但我现在得到以下结果:

-> gawk: cmd. line:1: (FILENAME=- FNR=1) warning: gensub: third argument `hru, bro' treated as 1 
hello"hru, bro" 
+0

好的,谢谢,我应该检查文档并使用'gensub'来代替。所以我删掉了这个问题,因为它很笨。 – user3639782

+0

其实它并没有解决问题,我已经相应地更新了我的帖子。 – user3639782

+0

您现在将错误的参数传递给gensub(),就像警告消息告诉您的一样,但由于您没有向我们显示该代码,因此我们无法告诉您更多。 –

回答

1

gsub变异的第三个参数,并返回替换所做的数 - 中这种情况下,1

我建议改变你的代码是这样的:

awk 'match($0, /([^"]*")([^"]+)(".*)/, m) { 
    $0 = m[1] gensub(/,/, "", "g", m[2]) m[3] 
} 1' 

如果说有什么用双引号就行了包围,然后重建它,使用gensub删除从中间捕获组的逗号(即双引号之间的部分)。

注意gensub需要4个参数,其中第三被用于指定要进行更换的数量("g"装置全球)。