awk 模式是否匹配的条件

awk condition on whether pattern is matched

我正在尝试让 awk 更改给定的模式(如果匹配)或 return 原始行。这是我的代码

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

-> 1

我希望匹配到 return 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" 

gsub 改变第三个参数和 returns 替换的次数 - 在这种情况下,1.

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

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

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

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