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 <*>
}
# 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は錆びているため、実際のコードは提供しません。
- 正規表現と値を使用して配列を初期化します。
- 各行について、配列を反復処理し、適切な置換を行います。使用済みのエントリを削除します。
- 最後に、配列を繰り返し、残りのエントリに行を追加します。
所属していません StackOverflow