2013-05-10 2 views
0

У меня есть эта частичная строка SQL.sed для замены запятой вне круглых скобок

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

Использование СЭД, я пытался заменить любую запятую, которые находятся за пределами крайних скобках со строкой символа «~».

Желаемый результат будет: -

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 

Как я могу игнорировать запятая внутри outmost круглые скобки?

TQ за любой ответ .. :)

ответ

1

Это невозможно достичь такой цели чистой SED регулярного выражения. Правильный/неправильный брекетинг и его глубина не могут быть распознаны обычными автоматами (и, следовательно, они не могут быть распознаны регулярными выражениями).

Если вы хотите достичь этого с помощью «регулярного выражения», вы можете использовать Perl и его функции look-ahead/look-behind. Или напишите простой цикл, который проверяет брекетинг.

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 

Не может быть гораздо более прямо вперед ...

Смежные вопросы