2011-12-22 11 views
11

से किसी प्रॉपर्टी फ़ाइल में एक संपत्ति मान संपादित करें शीर्षक सभी कहते हैं। मुझे एक संपत्ति मूल्य को प्रतिस्थापित करने की आवश्यकता है जिसे मैं एक अलग मूल्य के बारे में नहीं जानता। मैं इस कोशिश कर रहा हूँ:शेल स्क्रिप्ट

#!/bin/bash 
sed -i "s/myprop=[^ ]*/myprop=$newvalue/g" file.properties 

मैं मिल sed: -e expression #1, char 19: unknown option to s'`

मुझे लगता है कि समस्या यह है कि $newvalue एक स्ट्रिंग है कि एक निर्देशिका का प्रतिनिधित्व करता है तो यह sed को खराब करता है।

मैं क्या कर सकता हूं?

+3

'/' सिर्फ 'sed' के लिए हमेशा की तरह (लेकिन अनिवार्य नहीं) सीमांकक है। क्या होता है यदि आप कुछ और कोशिश करते हैं, जैसे पाइप ('|')? –

+0

@DanFego काम किया! मुझे यह महसूस करने में लंबा लगा कि मेरी var स्ट्रिंग में '/' समस्या थी। भूल गए कि आप sed delimiter स्विच कर सकते हैं। धन्यवाद – Michael

+1

आप 'जी' संशोधक का उपयोग क्यों करते हैं? कुछ seds के लिए – fge

उत्तर

7

sed/ के अलावा अन्य वर्णों का उपयोग delimiter के रूप में कर सकते हैं, भले ही / सबसे आम है। पथनाम जैसी चीज़ों से निपटने पर, इसके बजाय पाइप (|) जैसे कुछ उपयोग करने में अक्सर सहायक होता है।

+0

आपको गैर-मानक reg-ex delimiter के पहले उदाहरण 'से बचने' की आवश्यकता होगी, जैसे \ s srch | repl | '। आप सभी को शुभकामनायें। – shellter

7

अपनी संपत्ति फ़ाइल इस तरह = संकेत के साथ सीमांकित है -

param1=value1 
param2=value2 
param3=value3 

तो आप awk उपयोग कर सकते हैं बस परम नाम जानने द्वारा परम मूल्य modifiy है। उदाहरण के लिए, अगर हम अपनी संपत्ति फ़ाइल में param2 संशोधित करना चाहते हैं, हम निम्न कर सकते हैं -

awk -F"=" '/param2/{$2="new value";print;next}1' filename > newfile 

अब, ऊपर one-liner आप कठिन कोड परम के नए मूल्य की आवश्यकता है। यह मामला नहीं हो सकता है यदि आप इसे शैल स्क्रिप्ट में उपयोग कर रहे हैं और एक चर से नया मान प्राप्त करने की आवश्यकता है।

उस मामले में, आप निम्न कर सकते -

awk -F"=" -v newval="$var" '/param2/{$2=newval;print;next}1' filename > newfile 

इस में हम एक awk चर newval बना सकते हैं और अपनी स्क्रिप्ट चर ($ वर) जो नए पैरामीटर मान के साथ आरंभ कर देगा।

+0

यदि संपत्ति मौजूद नहीं है तो मैं अंत में एक नई लाइन जोड़ना चाहता हूं? –

+0

मैंने 'awk' कमांड को आज़माया है लेकिन यह आउटपुट से' = 'को स्ट्रिप्स करता है, इसलिए 'HOSTNAME = oldvalue' को' HOSTNAME newvalue 'में परिवर्तित कर देता है - कोई विचार है कि मुझे क्या गलत है? –

+1

@ केवल आपको ओएफएस चर सेट करने की आवश्यकता होगी। तो 'awk -F' = '-v OFS =' = '...' –

0

मुझे कॉंगचेन नामक किसी व्यक्ति से एक फ़ंक्शन मिला। उन्होंने कहा कि संपत्ति के मूल्यों को बदलने के लिए एक समारोह पटकथा लिखी और यह मेरे लिए ठीक काम किया:

इसे देखें: https://gist.github.com/kongchen/6748525

संबंधित मुद्दे