파일의 한 줄에 키 값을 설정하거나, 그 사이에 특정 줄이 존재하지 않는 경우 특정 값을 설정합니다.

파일의 한 줄에 키 값을 설정하거나, 그 사이에 특정 줄이 존재하지 않는 경우 특정 값을 설정합니다.

다음 구성 파일이 제공됩니다.

    shape {
        visible: true
        type: rectangle
        ...
    }
    
    shape {
        type: circle
        visible: isRound === "true"
        ...
    }
    
    shape {
        // comment: "visible" not set, default "true" 
    }

주석을 건드리지 않고 키(속성)를 사용하여 모든 값을 설정하고 bash이전 값을 주석으로 유지하려면 어떻게 해야 합니까? 새 콘텐츠는 다음과 같아야 합니다.visiblefalse

    shape {
        visible: false
        type: rectangle
        ...
    }
    
    shape {
        type: circle
        visible: false // visible: isRound === "true"
        // ideally, above, the old value is kept as a comment...
        ...
    }
    
    shape {
        visible: false
        // comment: "visible" not set, default "true" 
    }

파일은 단순한 shape구조 목록이 아니라 다른 항목도 포함할 수 있습니다. 이것은 아마도품질 관리 언어준수하다.

awk보여주다:

awk --version
GNU Awk 5.2.1, API 3.2
Copyright (C) 1989, 1991-2022 Free Software Foundation.

편집하다

나는 이것을 사용할 수 있다고 생각합니다 PCRE regex:

(\s*shape\s*\{\n)(\s*)(.*?)(visible\:.*\n?)?(.*?)(\n\s*\})

대체 표현식은 다음과 같습니다.

$1$2visible: false // $4\n$2$5$6

또는

\1\2visible: false // \4\n\2\5\6

하지만 이를 적용하려면 도구가 필요합니다. 완벽하지는 않으며 여전히 두 번 검토할 필요가 없습니다.

답변1

perl이런 종류의 일 에 내가 사용할 것 :

perl -0777 -pe '
  s{shape\s*\{.*?\}}{
    $& =~ s{(//.*)|\b(visible:\s*+)(?!true\s*$).*}{$1 ? $1 : "${2}true // $&"}gmre
  }gse' your-file

답변2

awk -v key='visible:' -v value='false' '
    /{/ {
        found=0 # reset flag
    }
    $1==key {
        found=1 # set flag
        
        # change true to value
        if ($2=="true") { sub($2, value, $0) }

        # if not value, replace property with key-value and comment
        else if ($2!=value) { sub($1, $1 " " value " // " $1, $0) }
    }
    /}/ && !found {
        # get indentation of }
        indent=$0; sub(/}.*/, "", indent)
        
        # insert property
        print indent indent key " " value
    }
    { print }
' file

속성/설명에는 다른 시작 {이나 끝이 있어서는 안 됩니다 }. 그렇지 않으면 삽입이 작동하지 않습니다. 또한 다른 행에도 나타나야 합니다.

닫기 전에 누락된 속성을 삽입 }하고 들여쓰기를 의 들여쓰기의 두 배로 설정합니다 }. 이것이 항상 올바른지 또는 이를 결정하는 방법(탭이 두 개?)인지 잘 모르겠습니다.

속성에 이미 올바른 값이 있으면 변경되지 않은 상태로 유지됩니다.

주석에서 속성 이름을 반복하지 않으려면 명령을 로 변경합니다 sub($1, $1 " " value " //", $0). 결과는 다음과 같습니다 visible: false // isRound === "true".

산출:

    shape {
        visible: false
        type: rectangle
        ...
    }
    
    shape {
        type: circle
        visible: false // visible: isRound === "true"
        ...
    }
    
    shape {
        // comment: "visible" not set, default "true" 
        visible: false
    }

관련 정보