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

관련 정보