【问题标题】:regex submatch replace正则表达式子匹配替换
【发布时间】:2011-08-02 00:01:05
【问题描述】:

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

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

有没有办法用 sedawk 做到这一点?

谢谢!

【问题讨论】:

标签: regex sed awk


【解决方案1】:

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

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'

【讨论】:

    【解决方案2】:

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

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

    我猜你可能需要稍微转义 " 才能使其与 awk/sed 一起正常工作

    如果你有 perl 那就是

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

    编辑: 好的,抱歉,我不知道 sed/awk 根本不支持前瞻/后视。恐怕没有至少前瞻就无法完成这项任务。

    【讨论】:

      猜你喜欢
      • 2012-05-16
      • 2013-12-06
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多