用 sed/awk 替换特定列的内容

用 sed/awk 替换特定列的内容

提供的文件:

$ cat CronConfig 
 `FILE SYSTEM`
`------------` 
 warningThreshold: 77 
 criticalThreshold: 99

`MEMORY`
`-------`
warningThreshold: 66
criticalThreshold: 88

`CPU`
`----`
intervalCount: 6
intervalSecs: 7
warningThreshold: 99
criticalThreshold: 88

CronConfig我有一个包含上述内容的文件。我想替换warningThreshold和的值criticalThreshold并想要以下输出:

所需文件:

`FILE SYSTEM`
`------------`
warningThreshold: 11 
criticalThreshold: 22

`MEMORY`
`-------`
warningThreshold: 66
criticalThreshold: 88

`CPU`
`----`
intervalCount: 6
intervalSecs: 7
warningThreshold: 99
criticalThreshold: 88

答案1

您可以轻松地做到这一点,sed只需在之后剥离任何东西warningThreshold:或之后的任何内容criticalThreshold:并将其替换为所需的数字即可:

sed -e '/FILE SYSTEM/,/^$/ {' \
    -e 's/^[[:blank:]]*\(warningThreshold:\).*/\1 11/' \
    -e 's/^[[:blank:]]*\(criticalThreshold:\).*/\1 22/' \
    -e '}' CronConfig >CronConfig.new

或者,等价地,

sed '/FILE SYSTEM/,/^$/ {
        s/^[[:blank:]]*\(warningThreshold:\).*/\1 11/
        s/^[[:blank:]]*\(criticalThreshold:\).*/\1 22/
    }' CronConfig >CronConfig.new

比赛\( ... \)并捕获括号内的字符串,这使得可以将该字符串用作\1在替换文本中一样使用该字符串。

^[[:blank:]]*表达式中的 允许该行具有初始空格或制表符该行上的任何初始空格或制表符都将被删除。

FILE SYSTEMS这两个替换仅针对与字符串匹配的行和下一个空行(即文件的第一部分)之间的行进行。

答案2

$ awk '
    !NF { f = 0 }
    /FILE SYSTEM/ { f = 1 }
    f && /warningThreshold/ { $2 = 11 }
    f && /criticalThreshold/ { $2 = 22 }
1' file
 `FILE SYSTEM`
`------------`
warningThreshold: 11
criticalThreshold: 22

`MEMORY`
`-------`
warningThreshold: 66
criticalThreshold: 88

`CPU`
`----`
intervalCount: 6
intervalSecs: 7
warningThreshold: 99
criticalThreshold: 88

相关内容