محرج:إما تعديل أو إلحاق سطر، بناءً على وجوده
-
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]
}
}
نصائح أخرى
AWK الخاص بي صدئ، لذا لن أقدم الرمز الفعلي.
- تهيئة مصفوفة تحتوي على التعبيرات والقيم العادية.
- لكل سطر، قم بتكرار المصفوفة وإجراء البدائل المناسبة.تنظيف الإدخالات المستخدمة.
- في النهاية، قم بتكرار المصفوفة وإلحاق الأسطر للإدخالات المتبقية.
لا تنتمي إلى StackOverflow