有谁知道如何替换()
之间的特定字词。因此,例如,在两组括号中用and
替换单词or
:
(等级='C'且等级='D'且等级='E')和(int_rate> = 10且int_rate< = 20)和pub_rec> = 0 和术语='36个月'
这将是:
(成绩='C'或成绩='D'或成绩='E')和(int_rate> = 10 或 int_rate< = 20)和pub_rec> = 0 和术语='36个月'
答案 0 :(得分: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'
答案 1 :(得分:1)
这可能适合你(GNU sed):
sed -r ':a;s/\band\b([^()]*\))/or\1/;ta' file
在and
到(...)
的{{1}}内更改or
的文件向后工作。
答案 2 :(得分: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";
答案 3 :(得分: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,然后将all全部转换为单行。
答案 4 :(得分:0)
使用vim
的一种解决方案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'
还会创建一个备份文件,将~
后缀附加到原始文件名。
答案 5 :(得分:0)
我不知道Sed,但这里是一个只有and
的正则表达式后跟)
:
\band\b(?=[^(]*\))
只需将or
替换为this demo。
旁注:这不会检查输入的语法,即括号的数量等。如果您打算这样做,也许一些现有的解析器可以满足您的需求。