正则表达式子匹配替换

时间:2011-08-01 10:33:01

标签: regex sed awk

我正在尝试替换所有出现的单词,但仅限于放在一对分隔符内。例如:

Original: asdf oldfoo asdf ("asdf oldfoo asdf oldfoo asdf") asdf oldfoo asdf
Desired:  asdf oldfoo asdf ("asdf newfoo asdf newfoo asdf") asdf oldfoo asdf

有没有办法用 sed awk 来做?

谢谢!

2 个答案:

答案 0 :(得分:2)

如果分隔符为'("''")',并且每行只出现一次分隔符:

sed -e ':begin;s/\(.*(".*\)oldfoo\(.*").*\)/\1newfoo\2/;t begin'

如果每行出现多次,则不起作用,因为中间的'oldfoo'碰巧位于外部分隔符内:

asdf oldfoo asdf ("asdf oldfoo asdf oldfoo asdf") asdf oldfoo asdf ("asdf oldfoo asdf oldfoo asdf") asdf oldfoo asdf

如果您的分隔符为'('')',即使每行有多个分隔符,这也会有效:

sed -e ':begin;s/\(.*([^)]*\)oldfoo\([^(]*).*\)/\1newfoo\2/;t begin'

答案 1 :(得分:0)

是的,正如@nobody提到的那样,它就像是

oldfoo(?=[^"]*"([^"]*"[^"]*")*[^"]*$)

我猜你可能不得不放弃"以使其与awk / sed一起正常工作

如果你有perl,那就是

perl -pe 's/oldfoo(?=[^"]*"([^"]*"[^"]*")*[^"]*$)/newfoo/g' whatever.txt

编辑: 对不起,我不知道sed / awk根本不支持lookahead / lookbehind。我担心没有至少前瞻就没有办法完成这项任务。