패턴과 일치하고 다음 키-값 쌍의 값을 바꿉니다.

패턴과 일치하고 다음 키-값 쌍의 값을 바꿉니다.

다음과 같은 섹션이 포함된 파일을 수정하려고 합니다.

[ policy_strict ]
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[ policy_loose ]
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[ req_distinguished_name ]
countryName                     = UK
stateOrProvinceName             = Scotland
localityName                    = Glasgow
0.organizationName              = aworkplace
organizationalUnitName          = eng
commonName                      = my.webiste.com
emailAddress                    = [email protected]

common name마지막 섹션의 필드 값을 수정하고 싶습니다 .

비슷한 해결책이 있어야 한다고 생각합니다이 솔루션.

sed '/[삽]/,/^$/ s/enable=0/enable=1/'

차이점은 대체되는 값이 sed 명령에서 일치하는 표현식의 일부가 아니라는 것입니다.

고쳐 쓰다

의견을 바탕으로 몇 가지 설명을 하자면, 목표는 commonName해당 섹션 req_distinguished_name의 필드 만 변경하는 것입니다. 예를 들어

[ policy_strict ]
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[ policy_loose ]
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[ req_distinguished_name ]
countryName                     = UK
stateOrProvinceName             = Scotland
localityName                    = Glasgow
0.organizationName              = aworkplace
organizationalUnitName          = eng
commonName                      = adifferentvaluetotheoneintheabovesnippet
emailAddress                    = [email protected]

답변1

GNU sed확장 정규식 모드에서는 -E범위 연산자를 사용하여 ,올바른 블록을 선택하고 해당 블록 내에서s/정규식/repl/편집을 위해 오른쪽 행을 0으로 만듭니다.

sed -Ee '
  /\[ req_distinguished_name ]/,/^$/s/^(\s*commonName\s*=).*/\1__NEWVALUE__/
' file

답변2

파일에서 commonName 속성의 값을 바꾸고 그렇게 명명된 속성의 모든 값을 바꾸려고 한다고 가정하면 다음이 작동합니다(그리고 PCRE를 가정).

s/(^commonName\s+=\s*)(.*)$/\1<your replacement text here>/

예를 들어, 새 값 "foo"를 설정한다고 가정하면 예제 파일은 다음을 실행합니다.

s/(^commonName\s+=\s*)(.*)$/\1foo/

그러면 다른 모든 행은 변경되지 않고 그대로 유지되고 commonName 값은 모두 다음으로 대체됩니다.

commonName              = foo
commonName              = foo
and
commonName                      = foo

마지막 항목만 바꾸려는 경우 가장 쉬운 방법은 섹션 표시를 찾을 때까지 프로그램의 이전 부분을 건너뛴 다음 첫 번째 항목을 위의 s/// 구조로 바꾼 다음 편집을 중지하는 것입니다.

업데이트: 위에서 언급한 대로 먼저 편집하려는 블록의 블록 헤더를 찾은 다음 다음 블록 헤더에 도달할 때까지 편집(정규식 대체 적용)한 후 무시하여(예: PERL)에서 이 작업을 수행할 수 있습니다. 파일 부분의 나머지 부분. Perl에서는 다음과 같이 보일 수 있습니다:

#!/usr/bin/env perl -pi.orig

while (<> !~ /\[ req_distinguished_name \]/) { # do nothing
};
while (<> !~ /^\[\s*[\w\d_+]\s*\]/) { s/^(commonName\s*=\s*)(.*)$/\1<repl>/; }
while (!eof()) { <>; }

그러면 명령줄 인수에 지정된 파일이 편집되고 수정되지 않은 파일의 백업 복사본이 ".orig"에 저장됩니다.

이는 원하는 것과 매우 유사해야 합니다.

관련 정보