使用sed替换字符之间的特定单词?

时间:2013-06-03 14:48:55

标签: regex sed

有谁知道如何替换()之间的特定字词。因此,例如,在两组括号中用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个月'

6 个答案:

答案 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)

使用

的一种解决方案

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


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