次の構成ファイルが提供されます。
shape {
visible: true
type: rectangle
...
}
shape {
type: circle
visible: isRound === "true"
...
}
shape {
// comment: "visible" not set, default "true"
}
コメントに触れずにキー(プロパティ)を使用してすべての値を設定し、bash
以前の値をコメントに保つにはどうすればよいですか?新しいコンテンツは次のようになります。visible
false
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
}