2013-05-10 68 views
0

我有这个部分的SQL字符串。sed将圆括号内的逗号替换为

select ID,to_char(ts2date(created_t),'DD-MM-YYYY'),name,segment_code from sometable 

使用sed,我尝试用字符串char'〜'替换驻留在最外括号之外的任何逗号。

期望的结果将是: -

select ID~to_char(ts2date(created_t),'DD-MM-YYYY')~name~segment_code from sometable 

这里是我的尝试: -

sed ' 
:a 
s/[,]\(.*(\)/~\1/g 
s/\().*\)[,]/\1~/g 
ta 

但结果变成: -

select ID~to_char(ts2date(created_t)~'DD-MM-YYYY')~name~segment_code from sometable 

我怎么能够无视在以内的逗号最外面的括号?

TQ任何答案.. :)

回答

1

这是不可能用纯sed的正则表达式来达到这样的目的。正确/不正确的包围及其深度不能被普通自动识别器识别(因此它不能被正则表达式识别)。

如果您想用“正则表达式”达到此目的,您可能想要使用perl及其预见/后退功能。或者写一个检查包围的简单循环。

1

sed是简单替换一条线上的优秀工具。对于任何其他文本操作,只用awk:

$ awk '{ 
    match($0,/\(.*\)/) 

    head = substr($0,1,RSTART-1) 
    tail = substr($0,RSTART+RLENGTH) 

    gsub(/,/,"~",head) 
    gsub(/,/,"~",tail) 

    print head substr($0,RSTART,RLENGTH) tail 
}' file 
select ID~to_char(ts2date(created_t),'DD-MM-YYYY')~name~segment_code from sometable 

不能更加直截了当...

相关问题