sed用括号外的逗号替换

时间:2013-05-10 11:47:28

标签: regex string sed

我有这个部分SQL字符串。

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 .. :)

2 个答案:

答案 0 :(得分:1)

使用纯sed正则表达式无法实现这样的目标。常规自动机无法识别正确/不正确的包围及其深度(因此正则表达式无法识别)。

如果您希望使用“正则表达式”来实现此目标,则可能需要使用perl及其前瞻/后视功能。或者写一个简单的循环来检查包围。

答案 1 :(得分: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

不可能更直接......

相关问题