0

我有这个部分 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 任何答案.. :)

4

2 回答 2

1

使用纯 sed 正则表达式是不可能达到这样的目标的。正则自动机无法识别正确/错误的包围及其深度(因此正则表达式无法识别)。

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

于 2013-05-10T12:08:36.680 回答
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

不能再直截了当了……

于 2013-05-10T22:57:08.470 回答