AWK : 존재에 따라 라인을 수정하거나 추가합니다.
-
08-07-2019 - |
문제
내 파일 수정을 수행하는 작은 awk 스크립트가 있습니다 (Java에게 .properties
아이디어를 제공하려면 파일). 이것은 많은 사용자에게 영향을 미치는 배포 스크립트의 일부입니다.
기본값을 설정하여 나머지 파일을 사용자의 환경 설정에 남겨두고 싶습니다. 이는 누락 된 경우 구성 라인을 추가하여 다른 모든 것을 그대로 남겨 두는 경우 수정을 의미합니다.
현재 나는 다음과 같은 것을 사용합니다.
# initialize
BEGIN {
some_value_set = 0
other_value_set = 0
some_value_default = "some.value=SOME VALUE"
other_value_default = "other.value=OTHER VALUE"
}
# modify existing lines
{
if (/^some\.value=.*/)
{
gsub(/.*/, some_value_default)
some_value_set = 1
}
else if (/^other\.value=.*/)
{
gsub(/.*/, other_value_default)
other_value_set = 1
}
print $0
}
# append missing lines
END {
if (some_value_set == 0) print some_value_default
if (other_value_set == 0) print other_value_default
}
특히 제어하고 싶은 줄의 수가 커질 때, 이것은 점점 번거롭게 진행됩니다. 내 어색한 지식은 그다지 크지 않으며 위의 느낌 잘못 - 어떻게 이것을 간소화 할 수 있습니까?
추신 : 가능하면 Awk와 함께 머물고 싶습니다. Perl/Python/를 사용하는 것이 훨씬 쉬운 것을 권장하지 마십시오. :-)
해결책
BEGIN {
defaults["some.value"] = "SOME VALUE"
defaults["other.value"] = "OTHER VALUE"
}
{
for (key in defaults) {
pattern = key
gsub(/\./, "\\.", pattern)
if (match($0, "^" pattern "=.*")) {
gsub(/=.*/, "=" defaults[key])
delete defaults[key]
}
}
print $0
}
END {
for (key in defaults) {
print key "=" defaults[key]
}
}
다른 팁
내 어색은 녹슬 었으므로 실제 코드를 제공하지 않을 것입니다.
- 정규 표현식 및 값으로 배열을 초기화하십시오.
- 각 라인마다 배열을 반복하고 적절한 대체를 수행하십시오. 중고 항목을 청소하십시오.
- 결국, 배열을 반복하고 남은 항목에 대한 라인을 추가하십시오.
제휴하지 않습니다 StackOverflow