如果匹配或返回原始行,我试图让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"
答案 0 :(得分:1)
gsub
改变第三个参数并返回所做的替换次数 - 在本例中为1
。
我建议您将代码更改为以下内容:
awk 'match($0, /([^"]*")([^"]+)(".*)/, m) {
$0 = m[1] gensub(/,/, "", "g", m[2]) m[3]
} 1'
如果该行上有引号包围的任何内容,则使用gensub
重新构建它以从中间捕获的组中删除逗号(即双引号之间的部分)。
请注意,gensub
需要4个参数,其中第三个参数用于指定要进行的替换次数("g"
表示全局)。