使用awk的gsub多模式匹配替换仅生效一个模式的问题
awk多模式gsub替换仅第一个生效的解决办法
问题场景
执行awk脚本进行多模式搜索替换时,只有第一个替换规则生效,后续规则被忽略:
原执行命令:
output=$(echo "$output4" | awk 'NR>1 {gsub(/\[|]/,""); gsub("+r","READ"); gsub("+r+w","READ and WRITE"); gsub("+r+w+g","READ, WRITE and GRANT"); print}')
实际输出:
Group Analyst_Corp in security domain Native: READ. Group Finance_Dev in security domain Native: READ+w. Manufacturing_Corp in security domain Native: READ+w Information_Tech in security domain Native: READ+w+g.
期望输出:
Group Analyst_Corp in security domain Native: READ. Group Finance_Dev in security domain Native: READ and WRITE. Manufacturing_Corp in security domain Native: READ and WRITE Information_Tech in security domain Native: READ, WRITE and GRANT.
问题原因
替换顺序搞反了:先执行gsub("+r","READ")会把所有+r替换成READ,导致原本的+r+w变成READ+w,+r+w+g变成READ+w+g,后面的规则根本匹配不到目标字符串,自然不会生效。
解决办法
把替换顺序改成从最长的模式到最短的模式,先处理最长的+r+w+g,再处理+r+w,最后处理+r,这样长模式不会被提前替换破坏:
修正后的命令:
output=$(echo "$output4" | awk 'NR>1 {gsub(/\[|]/,""); gsub("+r+w+g","READ, WRITE and GRANT"); gsub("+r+w","READ and WRITE"); gsub("+r","READ"); print}')
另外注意:+在正则里是特殊字符,最好用反斜杠转义,写成\+避免意外匹配,更严谨的写法:
output=$(echo "$output4" | awk 'NR>1 {gsub(/\[|]/,""); gsub(/\+r\+w\+g/,"READ, WRITE and GRANT"); gsub(/\+r\+w/,"READ and WRITE"); gsub(/\+r/,"READ"); print}')
这样执行后就能得到期望的输出结果。
内容的提问来源于stack exchange,提问作者bob freeman
相关产品推荐
相关产品推荐

