質問

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

# append missing lines
END {
  if (some_value_set   == 0) print some_value_default
  if (other_value_set  == 0) print other_value_default
}

特に、制御したい行の数が多くなると、これはますます面倒になります。私のawkの知識はそれほど素晴らしいものではありません。上記のことは間違っていると感じています。

PS:可能であれば、awkを使い続けたいと思います。 Perl / Python / whateverを使用する方がはるかに簡単であることをお勧めしないでください。 :-)

役に立ちましたか?

解決

BEGIN {
    defaults["some.value"]  = "SOME VALUE"
    defaults["other.value"] = "OTHER VALUE"
}

{
    for (key in defaults) {
        pattern = key
        gsub(/\./, "\\.", pattern)
        if (match(<*>, "^" pattern "=.*")) {
            gsub(/=.*/, "=" defaults[key])
            delete defaults[key]
        }
    }
    print <*>
}

END {
    for (key in defaults) {
        print key "=" defaults[key]
    }
}

他のヒント

私のAWKは錆びているため、実際のコードは提供しません。

  • 正規表現と値を使用して配列を初期化します。
  • 各行について、配列を反復処理し、適切な置換を行います。使用済みのエントリを削除します。
  • 最後に、配列を繰り返し、残りのエントリに行を追加します。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top