关于模式是否匹配的awk条件

时间:2016-09-20 13:08:52

标签: awk gsub

如果匹配或返回原始行,我试图让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用m [1]中的全部','替换。因此结果应该是

-> hello,hru bro\nhi,bye

我在这里缺少什么?

更新

根据Tom的评论,我将gsub替换为gensub,但现在我得到以下结果:

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

1 个答案:

答案 0 :(得分:1)

gsub改变第三个参数并返回所做的替换次数 - 在本例中为1

我建议您将代码更改为以下内容:

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

如果该行上有引号包围的任何内容,则使用gensub重新构建它以从中间捕获的组中删除逗号(即双引号之间的部分)。

请注意,gensub需要4个参数,其中第三个参数用于指定要进行的替换次数("g"表示全局)。