模式是否匹配的一种条件



我试图让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"表示全局)。

相关内容

  • 没有找到相关文章

最新更新