다음 구성 파일이 제공됩니다.
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
하지만 이를 적용하려면 도구가 필요합니다. 완벽하지는 않으며 여전히 두 번 검토할 필요가 없습니다.
답변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
}