다음과 같은 섹션이 포함된 파일을 수정하려고 합니다.
[ 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"에 저장됩니다.
이는 원하는 것과 매우 유사해야 합니다.