ファイルの1行にキー値を設定するか、その間に特定の行が存在しない場合は特定の値を設定します。

ファイルの1行にキー値を設定するか、その間に特定の行が存在しない場合は特定の値を設定します。

次の構成ファイルが提供されます。

    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

ただし、これを適用するにはツールが必要です。完璧ではなく、まだ2回レビューする必要はありません。

答え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

属性/説明には他の開始{や終了はありません}。それ以外の場合、挿入は機能しません。また、他の行にも表示する必要があります。

閉じる前に不足しているプロパティを挿入し、インデントをインデントの}2倍に設定します}。これが常に正しいかどうかを判断する方法(2つのタブ?)かどうかはわかりません。

プロパティにすでに正しい値がある場合は、変更されていません。

コメントで属性名を繰り返さないようにするには、コマンドをに変更します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
    }

関連情報