8

有谁知道如何替换(). 因此,例如,在两组括号之间and用in 替换单词:or

(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

真正愚蠢的方法:

$ 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 回答
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通过将's within更改(...)为's的文件向后工作or

于 2013-06-03T19:05:47.943 回答
0

我想了更多,想出了这个解决方案:

$ sed "s/(/\n(/g" | sed "s/)/)\n/g" | sed "/(/s/and/or/g" | tr '\n' '!' | sed "s/!//g"
(grade='C' or grade='D' or grade='E') and (int_rate>=10 or int_rate<=20) and pub_rec>=0 and term=' 36 months'

基本上,用分隔符作为括号将内容分解为多行,在所有带括号的行上使用 sed 将所有 ands 转换为 ors,然后将所有内容带回单行。

于 2013-06-03T18:05:17.717 回答
0

一种使用

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在后跟 a时才匹配的正则表达式)

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

or只需像这个演示一样替换匹配项。


旁注:这不会检查输入的语法,即括号的数量等。如果您打算这样做,也许一些现有的解析器可以满足您的需要。

于 2013-06-04T15:41:55.490 回答