【问题标题】:sed replace a line if prior line match pattern如果前一行匹配模式,sed 替换一行
【发布时间】:2016-12-17 09:17:04
【问题描述】:

我想知道如何替换包含模式的行,但前提是前一行有另一个使用 sed 的模式。我有一个包含以下内容的文本文件:

Property: ONE
Value: some_value
Property: TWO
Value: some_value
Property: THREE
Value: some_other_value

所以我想找到包含 some_value 的行并将整行替换为另一行,或者只更新值,但前提是属性行包含单词 ONE。最终结果应该是这样的

Property: ONE
Value: replaced_value
Property: TWO
Value: some_value
Property: THREE
Value: some_other_value 

【问题讨论】:

    标签: regex sed pattern-matching


    【解决方案1】:

    您可以使用awk

    awk 'BEGIN{FS=OFS=": "} p {
       $2 = "replaced_value"
    }
    {
       p = ($0 ~ /^Property: *ONE/ ? 1 : 0)
    } 1' file
    
    Property: ONE
    Value: replaced_value
    Property: TWO
    Value: some_value
    Property: THREE
    Value: some_other_value
    

    【讨论】:

      【解决方案2】:

      你可以像这样使用sed

      sed '/Property: ONE/{n;s/Value:.*/Value: replaced_value/}' file
      

      找到Property: ONE 模式后,我使用n 命令将下一行读入模式缓冲区,并使用s 命令替换该值。

      【讨论】:

        【解决方案3】:

        只需使用 awk:

        $ awk 'p~/Property: ONE/{$NF="replaced_value"} {p=$0; print}' file
        Property: ONE
        Value: replaced_value
        Property: TWO
        Value: some_value
        Property: THREE
        Value: some_other_value
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-15
          • 2021-11-18
          • 2018-08-12
          • 1970-01-01
          • 1970-01-01
          • 2021-04-02
          • 2015-04-10
          • 2020-01-14
          相关资源
          最近更新 更多