我正在尝试替换所有出现的单词,但仅限于放在一对分隔符内。例如:
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 来做?
谢谢!
答案 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。我担心没有至少前瞻就没有办法完成这项任务。