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