提供される文書:
$ 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つの置換は、文字列に一致する行と次の空行(つまりファイルの最初の部分)の間の行に対してのみ行われます。
答え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