سؤال

لدي برنامج نصي 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]
    }
}

نصائح أخرى

AWK الخاص بي صدئ، لذا لن أقدم الرمز الفعلي.

  • تهيئة مصفوفة تحتوي على التعبيرات والقيم العادية.
  • لكل سطر، قم بتكرار المصفوفة وإجراء البدائل المناسبة.تنظيف الإدخالات المستخدمة.
  • في النهاية، قم بتكرار المصفوفة وإلحاق الأسطر للإدخالات المتبقية.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top