我试图让awk改变给定的模式,如果匹配或返回原始行。这是我的代码
printf 'hello,"hru, bro"nhi,byen' | gawk 'match($0, /"([^"]+)"/, m) {if (m[1] == "") {print $0} else {print gsub(/,/,"",m[1])}}'
-> 1
我希望' match返回m[1]中匹配的模式,并且当有匹配时,gsub替换m[1]中的所有','。因此结果应该是
-> hello,hru bronhi,bye
我在这里错过了什么?
根据Tom的评论,我将gsub
替换为gensub
,但我现在得到以下结果:
-> gawk: cmd. line:1: (FILENAME=- FNR=1) warning: gensub: third argument `hru, bro' treated as 1
hello"hru, bro"
gsub
改变第三个参数并返回替换的次数—在本例中为1
。
我建议把你的代码改成这样:
awk 'match($0, /([^"]*")([^"]+)(".*)/, m) {
$0 = m[1] gensub(/,/, "", "g", m[2]) m[3]
} 1'
如果行上有任何被引号包围的东西,然后重建它,使用gensub
从中间捕获组(即双引号之间的部分)删除逗号。
注意gensub
有4个参数,其中第三个参数用于指定要进行替换的数量("g"
表示全局)。