如何用sed正确捕获分组,将EQUAL_NULL替换为COALESCE格式?
Sed正则分组捕获字段失败的修复
需求
将格式为 AND EQUAL_NULL(b.DATE_FIELD, a.DATE_FIELD) 的SQL语句,转换为:
AND COALESCE(b.DATE_FIELD, 'NA') = COALESCE(a.DATE_FIELD, 'NA')
需要动态捕获括号内的两个字段作为分组1和分组2,支持不同字段名的替换。
错误尝试及问题
原使用的sed命令:
echo "AND EQUAL_NULL(b.DATE_LOCAL, a.DATE_LOCAL)" | sed -n "s/AND EQUAL_NULL(\([^,]*\)\([^)]*\).*/COALESCE(\1\, \'NA\'\) = COALESCE(\2\, \'NA\'\)/p"
返回结果:
COALESCE(b.DATE_LOCAL, 'NA') = COALESCE(, a.DATE_LOCAL, 'NA')
问题在于第二个分组[^)]*直接匹配了逗号、空格和第二个字段,导致分组2开头多了无效的逗号和空格,且丢失了开头的AND。
正确解决方案
调整正则表达式,明确匹配两个字段之间的逗号和空格,同时保留开头的AND:
echo "AND EQUAL_NULL(b.DATE_LOCAL, a.DATE_LOCAL)" | sed -n "s/AND EQUAL_NULL(\([^,]*\), *\([^)]*\))/AND COALESCE(\1, 'NA') = COALESCE(\2, 'NA')/p"
正则说明
\([^,]*\):捕获第一个字段(匹配到逗号前的所有字符),对应分组\1, *:匹配字段间的逗号和任意数量的空格(兼容字段间有空格或无空格的情况)\([^)]*\):捕获第二个字段(匹配到右括号前的所有字符),对应分组\2- 替换部分直接将两个分组插入到
COALESCE函数中,同时保留原语句开头的AND
测试后输出符合预期:
AND COALESCE(b.DATE_LOCAL, 'NA') = COALESCE(a.DATE_LOCAL, 'NA')
内容的提问来源于stack exchange,提问作者Coldchain9
相关产品推荐
相关产品推荐

