8

間の特定の単語を置き換える方法を知っている人はいますか()。したがって、たとえば、単語andor両方の括弧のセットの間で置き換えます。

(grade='C' and grade='D' and grade='E') and (int_rate>=10 and int_rate<=20) and pub_rec>=0 and term=' 36 months'

これは:

(grade='C' or grade='D' or grade='E') and (int_rate>=10 or int_rate<=20) and pub_rec>=0 and term=' 36 months'

4

6 に答える 6

1

perl

#!/usr/bin/perl

$_ ="(grade='C' and grade='D' and grade='E') and (int_rate>=10 and int_rate<=20) and pub_rec>=0 and term=' 36 months'";
print "Before: $_\n";

while (/(\([^\)]+?)and(.+?\))/) {
    s/(\([^\)]+?)and(.+?\))/$1or$2/g;
}
print "After: $_\n";
于 2013-06-04T15:16:59.353 に答える
1

これはうまくいくかもしれません(GNU sed):

sed -r ':a;s/\band\b([^()]*\))/or\1/;ta' file

and内の(...)を に変更して、ファイル全体を逆方向に作業しますor

于 2013-06-03T19:05:47.943 に答える
1

本当にばかげたアプローチ:

$ sed 's/and/or/g' INPUT | sed 's/) or (/) and (/' | sed 's/\(.*\)or/\1and/'
(grade='C' or grade='D' or grade='E') and (int_rate>=10 or int_rate<=20) and pub_rec>=0 
and term=' 36 months'
于 2013-06-03T15:03:34.267 に答える
0

を使用した1つのソリューション

script.vimの内容

set backup
while search( ')', 'W' ) > 0 
    execute "normal vi)\<ESC>"
    '<,'>s/\v%V<and>/or/ge
    call cursor( line('.'), col('.') + 2 )
endwhile
normal ZZ

次のように実行します。

vim -S script.vim infile

これにより、ファイルがインプレースで更新され、次の結果が得られます。

(grade='C' or grade='D' or grade='E') and (int_rate>=10 or int_rate<=20) and pub_rec>=0 and term=' 36 months' 

~また、元のファイル名にサフィックスを追加してバックアップ ファイルを作成します。

于 2013-06-03T21:38:24.477 に答える
0

私はSedを知りませんが、これは次のand場合にのみ一致する正規表現です):

\band\b(?=[^(]*\))

このデモorと同じように、単に一致を置き換えます。


補足: これは、入力の構文、つまり括弧の数などをチェックしません。そうするつもりなら、おそらくいくつかの既存のパーサーがニーズに合うかもしれません。

于 2013-06-04T15:41:55.490 に答える