2010-03-17 18 views
35

का उपयोग कर कॉन्फ़िगरेशन फ़ाइल को संशोधित करें मैं एक कॉन्फ़िगरेशन फ़ाइल को संशोधित करने के लिए एक बैश स्क्रिप्ट लिख रहा हूं जिसमें कुंजी, मूल्य जोड़े का एक गुच्छा शामिल है। मैं कुंजी कैसे पढ़ सकता हूं और मूल्य ढूंढ सकता हूं और संभवतः इसे संशोधित कर सकता हूं?बैश स्क्रिप्ट

+0

मैं इस यहाँ https://stackoverflow.com/a/47509618/3343801 –

उत्तर

72

एकल मान को संशोधित करने के लिए अंधेरे में एक जंगली वार:

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" 

इस कुंजी का व्यवस्था बनाए रखने के नहीं होता

+7

-c मेरे पर्यावरण में अमान्य प्रतीत होता है। जब मैं -c से छुटकारा पाता हूं, यह काम करता है। धन्यवाद। –

+0

'-c' विकल्प फ़ाइल को प्रतिलिपि बनाने के लिए कहता है जब इसे घुमाता है (नाम बदलने के बजाए) - यह केवल स्वामित्व बदलने और रीड-ओनली फ़ाइलों के साथ गड़बड़ करने से रोकता है। उन आदतों में से एक जो मैंने बेवकूफ गलतियों से बचाने के लिए उठाया है (विशेष रूप से 'ढूंढें ... | xargs sed -i')। – Cascabel

+1

क्या मुझे वास्तव में इस उत्तर के लिए दो डाउनवॉट मिले? न केवल मैं अनुमान लगाता हूं कि ओपी क्या चाहता था, यह छोटा और कुशल है। किसी को भी समझाने की परवाह है? – Cascabel

-1

मान लीजिए कि आपकी कॉन्फ़िग फ़ाइल स्वरूप नीचे में है:

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 
+6

कि मूल्य की जगह नहीं होगी, बस इसे फिर से निचले भाग में जोड़ने के जवाब देने के लिए करने की कोशिश की है, यह कॉन्फ़िग फ़ाइल होने पर पूरी तरह से निर्भर है एक मान्य बैश स्क्रिप्ट, और ... वाह, अगर कॉन्फ़िगरेशन फ़ाइल में कुछ दुर्भावनापूर्ण है तो क्या होगा? – Cascabel

1
सामान्य रूप में

यह ग्रेप साथ जानकारी निकालने और कटौती करने के लिए आसान है मूल्य जोड़े स्पष्ट रूप से। यह सुनिश्चित करने के लिए त्रुटि जांच जोड़ें कि आप अपना डेटा खोना नहीं चाहते हैं।

+0

यदि आप डिस्क स्थान से बाहर निकलते हैं या यदि किसी भी कारण से आप 'फ़ाइल' नहीं बना सकते हैं तो आपका समाधान 'फ़ाइल' गायब हो जाएगा (किसी को मैन्युअल रूप से 'FILE.bak' को' FILE' 'को पुनर्प्राप्त करने के लिए मैन्युअल रूप से नामित करना होगा।) – vladr

+0

बिलकुल। यही कारण है कि मैंने 'त्रुटि त्रुटि जांच' लिखा था :) –

0

मान लिया जाये कि आप 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?)" 
2
sed "/^$old/s/\(.[^=]*\)\([ \t]*=[ \t]*\)\(.[^=]*\)/\1\2$replace/" configfile 
10

आशा इस कोई मदद करता है। मैंने एक स्वयं निहित स्क्रिप्ट बनाई, जिसके लिए प्रकार की कॉन्फ़िगरेशन प्रोसेसिंग की आवश्यकता थी।

#!/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 
संबंधित मुद्दे