0

この部分的な SQL 文字列があります。

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

sed を使用して、一番外側の括弧の外側にあるカンマを文字列 '~' に置き換えようとしました。

望ましい結果は次のとおりです。

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 に答える