का उपयोग कर कॉन्फ़िगरेशन फ़ाइल को संशोधित करें मैं एक कॉन्फ़िगरेशन फ़ाइल को संशोधित करने के लिए एक बैश स्क्रिप्ट लिख रहा हूं जिसमें कुंजी, मूल्य जोड़े का एक गुच्छा शामिल है। मैं कुंजी कैसे पढ़ सकता हूं और मूल्य ढूंढ सकता हूं और संभवतः इसे संशोधित कर सकता हूं?बैश स्क्रिप्ट
उत्तर
एकल मान को संशोधित करने के लिए अंधेरे में एक जंगली वार:
sed -c -i "s/\($TARGET_KEY *= *\).*/\1$REPLACEMENT_VALUE/" $CONFIG_FILE
यह सोचते हैं कि लक्ष्य कुंजी और प्रतिस्थापन मान में कोई विशेष रेगेक्स वर्ण नहीं होते हैं, और यह कि आपका कुंजी-मूल्य विभाजक "=" है। नोट, -सी विकल्प सिस्टम निर्भर है और इसे निष्पादित करने के लिए आपको इसे छोड़ने की आवश्यकता हो सकती है।
समान प्रतिस्थापन कैसे करें (उदाहरण के लिए, जब REPLACEMENT_VALUE में '/' अक्षर हैं), there are some great examples here पर अन्य युक्तियों के लिए।
cat "$FILE" | grep "^${KEY}${DELIMITER}" | cut -f2- -d"$DELIMITER"
अद्यतन करने के लिए आप कुछ इस तरह कर सकता है::
mv "$FILE" "$FILE.bak"
cat "$FILE.bak" | grep -v "^${KEY}${DELIMITER}" > "$FILE"
echo "${KEY}${DELIMITER}${NEWVALUE}" >> "$FILE"
इस कुंजी का व्यवस्था बनाए रखने के नहीं होता
-c मेरे पर्यावरण में अमान्य प्रतीत होता है। जब मैं -c से छुटकारा पाता हूं, यह काम करता है। धन्यवाद। –
'-c' विकल्प फ़ाइल को प्रतिलिपि बनाने के लिए कहता है जब इसे घुमाता है (नाम बदलने के बजाए) - यह केवल स्वामित्व बदलने और रीड-ओनली फ़ाइलों के साथ गड़बड़ करने से रोकता है। उन आदतों में से एक जो मैंने बेवकूफ गलतियों से बचाने के लिए उठाया है (विशेष रूप से 'ढूंढें ... | xargs sed -i')। – Cascabel
क्या मुझे वास्तव में इस उत्तर के लिए दो डाउनवॉट मिले? न केवल मैं अनुमान लगाता हूं कि ओपी क्या चाहता था, यह छोटा और कुशल है। किसी को भी समझाने की परवाह है? – Cascabel
मान लीजिए कि आपकी कॉन्फ़िग फ़ाइल स्वरूप नीचे में है:
CONFIG_NUM=4
CONFIG_NUM2=5
CONFIG_DEBUG=n
अपने bash स्क्रिप्ट में, आप का उपयोग कर सकते हैं:
CONFIG_FILE=your_config_file
. $CONFIG_FILE
if [ $CONFIG_DEBUG == "y" ]; then
......
else
......
fi
$CONFIG_NUM
, $CONFIG_NUM2
, $CONFIG_DEBUG
तुम क्या जरूरत है।
अपने के बाद मूल्यों को पढ़ने, लिखने के लिए इसे वापस आसान हो जाएगा:
echo "CONFIG_DEBUG=y" >> $CONFIG_FILE
कि मूल्य की जगह नहीं होगी, बस इसे फिर से निचले भाग में जोड़ने के जवाब देने के लिए करने की कोशिश की है, यह कॉन्फ़िग फ़ाइल होने पर पूरी तरह से निर्भर है एक मान्य बैश स्क्रिप्ट, और ... वाह, अगर कॉन्फ़िगरेशन फ़ाइल में कुछ दुर्भावनापूर्ण है तो क्या होगा? – Cascabel
यह ग्रेप साथ जानकारी निकालने और कटौती करने के लिए आसान है मूल्य जोड़े स्पष्ट रूप से। यह सुनिश्चित करने के लिए त्रुटि जांच जोड़ें कि आप अपना डेटा खोना नहीं चाहते हैं।
यदि आप डिस्क स्थान से बाहर निकलते हैं या यदि किसी भी कारण से आप 'फ़ाइल' नहीं बना सकते हैं तो आपका समाधान 'फ़ाइल' गायब हो जाएगा (किसी को मैन्युअल रूप से 'FILE.bak' को' FILE' 'को पुनर्प्राप्त करने के लिए मैन्युअल रूप से नामित करना होगा।) – vladr
बिलकुल। यही कारण है कि मैंने 'त्रुटि त्रुटि जांच' लिखा था :) –
मान लिया जाये कि आप key=value
जोड़े की एक फ़ाइल है कि =
के साथ स्पेस के साथ संभावित,, आप नष्ट कर सकते हैं, संशोधित यथा-स्थान या awk
का उपयोग कर भले ही कुंजियां या मूल्यों विशेष regex दृश्यों में शामिल होंगे पर कुंजी-मान जोड़ों संलग्न:
# Using awk to delete, modify or append keys
# In case of an error the original configuration file is left intact
# Also leaves a timestamped backup copy (omit the cp -p if none is required)
CONFIG_FILE=file.conf
cp -p "$CONFIG_FILE" "$CONFIG_FILE.orig.`date \"+%Y%m%d_%H%M%S\"`" &&
awk -F '[ \t]*=[ \t]*' '$1=="keytodelete" { next } $1=="keytomodify" { print "keytomodify=newvalue" ; next } { print } END { print "keytoappend=value" }' "$CONFIG_FILE" >"$CONFIG_FILE~" &&
mv "$CONFIG_FILE~" "$CONFIG_FILE" ||
echo "an error has occurred (permissions? disk space?)"
sed "/^$old/s/\(.[^=]*\)\([ \t]*=[ \t]*\)\(.[^=]*\)/\1\2$replace/" configfile
आशा इस कोई मदद करता है। मैंने एक स्वयं निहित स्क्रिप्ट बनाई, जिसके लिए प्रकार की कॉन्फ़िगरेशन प्रोसेसिंग की आवश्यकता थी।
#!/bin/bash
CONFIG="/tmp/test.cfg"
# Use this to set the new config value, needs 2 parameters.
# You could check that $1 and $1 is set, but I am lazy
function set_config(){
sudo sed -i "s/^\($1\s*=\s*\).*\$/\1$2/" $CONFIG
}
# INITIALIZE CONFIG IF IT'S MISSING
if [ ! -e "${CONFIG}" ] ; then
# Set default variable value
sudo touch $CONFIG
echo "myname=\"Test\"" | sudo tee --append $CONFIG
fi
# LOAD THE CONFIG FILE
source $CONFIG
echo "${myname}" # SHOULD OUTPUT DEFAULT (test) ON FIRST RUN
myname="Erl"
echo "${myname}" # SHOULD OUTPUT Erl
set_config myname $myname # SETS THE NEW VALUE
- 1. बैश स्क्रिप्ट
- 2. बैश स्क्रिप्ट
- 3. बैश स्क्रिप्ट
- 4. बैश स्क्रिप्ट
- 5. बैश स्क्रिप्ट
- 6. बैश स्क्रिप्ट
- 7. बैश स्क्रिप्ट
- 8. बैश स्क्रिप्ट
- 9. बैश स्क्रिप्ट
- 10. बैश स्क्रिप्ट
- 11. बैश स्क्रिप्ट
- 12. बैश स्क्रिप्ट
- 13. बैश स्क्रिप्ट
- 14. बैश स्क्रिप्ट
- 15. बैश स्क्रिप्ट
- 16. बैश स्क्रिप्ट से पाइथन स्क्रिप्ट
- 17. पाइथन स्क्रिप्ट से बैश स्क्रिप्ट
- 18. इनलाइन बैश स्क्रिप्ट चर
- 19. एसएड बैश स्क्रिप्ट
- 20. बैश स्क्रिप्ट- एक वैरिएबल
- 21. वैज्ञानिक नोटेशन बैश स्क्रिप्ट
- 22. बैश स्क्रिप्ट टर्मिनल
- 23. बैश स्क्रिप्ट - पाठ
- 24. एक बैश स्क्रिप्ट
- 25. बश स्क्रिप्ट उबंटू बैश
- 26. बैश स्क्रिप्ट आउटपुट इंडेंटिंग
- 27. एक बैश स्क्रिप्ट
- 28. बैश स्क्रिप्ट त्रुटि
- 29. बैश स्क्रिप्ट: SIGTSTP
- 30. एक बैश स्क्रिप्ट
मैं इस यहाँ https://stackoverflow.com/a/47509618/3343801 –