1

私はいくつかのインプレース ファイル変更を行う小さな 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
}

特に制御したい行数が多くなると、ますます面倒です。私のぎこちない知識はそれほど素晴らしいものではなく、上記は間違っているように感じます-どうすればこれを合理化できますか?

PS: 可能であれば、awk を使用したいと思います。Perl や Python などを使用する方がはるかに簡単だということだけを推奨しないでください。:-)

4

2 に答える 2

4
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]
    }
}
于 2009-05-07T15:32:24.690 に答える
2

My AWK is rusty, so I won't provide actual code.

  • Initialize an array with the regular expressions and values.
  • For each line, iterate the array and do appropriate substitutions. Clean out used entries.
  • At end, iterate the array and append lines for remaining entries.
于 2009-05-07T15:14:49.957 に答える