फ़ोल्डर पथ के साथ स्ट्रिंग को कैसे बदलें और बदलें


14

मैं निम्नलिखित बैश स्क्रिप्ट लिखने की कोशिश कर रहा हूं:

HOME_DIR=/opt/my_home
find ./CONFIG -type f -exec sed -i "s/_HOME_DIR_/$_HOME_DIR/g" {} \;

फ़ाइलों में परिवर्तित की जाने वाली पंक्ति यह है:

users                   = "_HOME_DIR_/config/data/_DOMAIN_/users.conf"

तो अंतिम परिणाम होना चाहिए:

users                   = "/opt/my_home/config/data/_DOMAIN_/users.conf"

लेकिन मुझे वह नहीं मिल रहा है ... मुझे लगता है कि यह भागने के आकर्षण के कारण है ...

क्या कोई इस पर थोड़ा प्रकाश डाल सकता है?

धन्यवाद


आप का मतलब है, एस (एच) एड कुछ प्रकाश
एलेक्जेंडर होल्डन Daly

जवाबों:


23

जिन परिस्थितियों में प्रतिस्थापन स्ट्रिंग या पैटर्न स्ट्रिंग में स्लैश होते हैं, आप इस तथ्य का उपयोग कर सकते हैं कि GNU sed वैकल्पिक विकल्प कमांड के लिए वैकल्पिक सीमांकक की अनुमति देता है। सीमांकक के सामान्य विकल्प पाइप चरित्र |या हैश हैं #- परिसीमन चरित्र का सबसे अच्छा विकल्प अक्सर संसाधित होने वाली फ़ाइल के प्रकार पर निर्भर करेगा। आपके मामले में आप कोशिश कर सकते हैं

sed -i "s#_HOME_DIR_#$HOME_DIR#"

यह भी ध्यान दें कि आपने अपने वैरिएबल नाम $ HOME_DIR को गलत ठहराया है (यह अंडरस्कोर से शुरू नहीं होता है)।

$ HOME_DIR=/opt/my_home
$ echo "_HOME_DIR_/config/data/_DOMAIN_/users.conf" | sed "s#_HOME_DIR_#$HOME_DIR#"
/opt/my_home/config/data/_DOMAIN_/users.conf

बस फी आप अपनी स्क्रिप्ट में उपयोगकर्ता चर के लिए ऑल-कैप का उपयोग करने से बचना चाहते हैं - उन्हें सिस्टम चर के लिए आरक्षित किया जाना चाहिए। gजब तक आप एक पंक्ति में कई प्रतिस्थापन करना चाहते हैं तब भी स्विच आवश्यक नहीं है।


0

चर / ऑप्ट / होम ’को हार्डकोड करना इस तरह से काम करेगा ।।

find ./CONFIG -type f -exec sed -i "s/\_HOME\_DIR\_/opt\/home/g" {} \;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.