বাশ স্ক্রিপ্টের মাধ্যমে কনফিগার ফাইল সম্পাদনা করা হচ্ছে


9

আমি একটি সাধারণ বাশ স্ক্রিপ্ট লেখার চেষ্টা করছি যা আমি কোনও অ্যাপ্লিকেশন ইনস্টল করতে এবং এর কনফিগার ফাইলটি আপডেট করতে ব্যবহার করব। এটির কনফিগার ফাইলটি সংশোধন করতে আমার খুব কষ্ট হচ্ছে।

# DBHost=localhost
DBName=test
# DBPassword=

নীচের মত আমি কীভাবে উপরে পরিবর্তন করতে পারি?

DBHost=localhost
DBName=database
DBPassword=password

আমি বিশ্বাস করতে পারি না আমাদের খুব সাধারণ কাজটি করতে কেবল ত্রুটিযুক্ত প্রবণ নিয়মিত ভাব প্রকাশ করতে হবে। সত্যিই "update_config test.confg -uncomment_if_pressent DBHost = লোকালহোস্ট" এর মতো একটি মানক সরঞ্জাম থাকা উচিত।
bigjosh

উত্তর:


3

সর্বোত্তম উপায়টি আপনি ফাইলটি মানুষের দ্বারাও সংশোধিত হওয়ার প্রত্যাশা করছেন কিনা, ফাইলটি কতটা জটিল, এবং আপনার স্ক্রিপ্টটি যদি অন্যরকম আলাদা মান চায় বলে মনে হয় তবে আপনি নিজের স্ক্রিপ্টকে অগ্রাধিকার দিতে চান কিনা তার উপর নির্ভর করে। এটি হ'ল যদি ফাইলটি ইতিমধ্যে থাকে DBPassword=swordfishতবে আপনি কি এটি রাখতে চান বা এটি দ্বারা প্রতিস্থাপন করতে চান DBPassword=password?

এটির মোকাবেলার একটি সাধারণ উপায় হ'ল "যাদু মন্তব্য" দ্বারা সীমাবদ্ধ ফাইলটির একটি অংশ থাকা এবং কেবলমাত্র এই মন্তব্যের মধ্যে থাকা অংশটি সম্পাদনা করা। অজানা দিয়ে এটি করার একটি উপায় এখানে। যাদু মন্তব্য উপস্থিত না থাকলে ফাইলের শেষে নতুন বিভাগটি যুক্ত করা হয়। সতর্কতা: অরক্ষিত কোড।

begin_marker='# BEGIN AUTOMATICALLY EDITED PART, DO NOT EDIT'
end_marker='# END AUTOMATICALLY EDITED PART'
new_section='DBHost=localhost
DBName=database
DBPassword=password'
export begin_marker end_marker
awk <file.conf >file.conf.new -v begin_marker="$begin_marker" -v begin_marker="$end_marker" -v new_section="$new_section" '
    1 {print}
    $0 == begin_marker && !changed {
        do {getline} while ($0 != end_marker); # discard old section content
        print new_section;
        print;
        changed = 1;
    }
    END {if (!changed) {print begin_marker; print new_section; print end_marker;}}
'
ln -f file.conf file.conf.old
mv -f file.conf.new file.conf

কনফিগারেশন ফাইল পড়ার প্রোগ্রাম যদি একই কনফিগারেশন আইটেমটি সেট করে একাধিক লাইন সমর্থন না করে তবে এই পদ্ধতিটি ভাল কাজ করে না। সেক্ষেত্রে আপনাকে সত্যিকারের পুরানোগুলি সরিয়ে ফেলতে হবে। এই ক্ষেত্রে আমি মন্তব্যগুলি ছোঁয়াছুটি রেখে এবং শেষে আপনার নিজের সেটিংস যুক্ত করার পরামর্শ দেব।

grep -vE '^[[:blank:]]*(DBHost|DBName|DBPassword)=$' <file.conf >file.conf.new
cat <<EOF >>file.conf.new
DBHost=localhost
DBName=database
DBPassword=password
EOF
ln -f file.conf file.conf.old
mv -f file.conf.new file.conf

আপনি কি এই কোডটি পরীক্ষা করেছেন? বা এটি এখনও অপরিবর্তিত?
নভেম্বর

এখানে অন্যান্য মহান উদাহরণ: stackoverflow.com/questions/5955548/...
rubo77

2

আপনার যদি প্রয়োজন হয় তবে আপনি এর মতো কিছু করতে পারেন

sed  -i.bak -e 's/DBName=.*/DBName=database/' \
 -e 's/#* *DBHost=.*/DBHost=localhost/' \
 -e 's/#* *DBPassword=.*/DBPassword=password/' config.file

এই মূল কপি হবে config.fileথেকে config.file.bakএবং প্রয়োজনীয় পরিবর্তন করুন।


2

আমি নীরব মোডে "প্রাক্তন" সাথে যাব:

ex -s $CONFIG_FILE << END_CMDS
%s/^#.DBHost/DBHOST/
%s/DBName=test/DBName=database/
%s/^#.DBPassword/DBPassword/
w!
q
END_CMDS

টার্ডনের sedকমান্ডটি কমপ্যাক্ট এবং দক্ষ is তবে প্রাক্তন কমান্ড এবং শেল স্ট্রিং ইন্টারপোলেশন পূর্ণ "এখানে দলিল" এর মিথস্ক্রিয়া শক্তিশালী হতে পারে। উদাহরণস্বরূপ, পাসওয়ার্ডটি শেল ভেরিয়েবলের মান হিসাবে প্রতিস্থাপিত হতে পারে:

%s/^#.DBPassword=password/DBPassword=$PASSWORD/

আপনি যদি ব্যবহার করেন viবা vimএবং আপনি ':' মোডের সাথে পরিচিত হন তবে নতুন / আরও ভাল / বিভিন্ন সম্পাদনা যুক্ত করাও বেশ সহজ।


প্রাক্তন শক্তিশালী থাকলেও ত্রুটিগুলি থেকে পুনরুদ্ধার করা কঠিন (উদাহরণস্বরূপ যখন প্রত্যাশিত লাইনটি অনুপস্থিত থাকে)। এখানে আপনি কোনও শর্তযুক্ত আচরণ ছাড়াই পালাতে পারবেন, তবে এটি এত ভাল জেনারেল হয় না।
গিলস 'অশুভ হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.