2012-01-03 15 views
8

में एम्बेडेड एक स्क्रिप्ट स्क्रिप्ट में बैकस्लाश से कैसे बचूं मैं बैश स्क्रिप्ट में एक स्क्रिप्ट स्क्रिप्ट के माध्यम से एक फ़ाइल संपादित करना चाहता हूं। मैं इसे बाद में बनाए रखना आसान बनाना चाहता हूं; समझने और संशोधित करने में आसान है। प्रतिस्थापन स्ट्रिंग लगता है:मैं बैश स्क्रिप्ट

PS1='\[\e[1;32m\][\[email protected]\h \W]\$\[\e[0m\]' 

एक आदर्श दुनिया में, यह इस चाहते हैं:

sed -i "s/^PS1.*$/PS1='\[\e[1;32m\][\[email protected]\h \W]\$\[\e[0m\]'/g" /etc/skel/.bashrc 

समस्या यह है कि पार्टी और एसईडी फ़ाइल में निम्न परिणाम दे रही है \ बाहर अलग करना कर रहे हैं:

PS1='[e[1;32m][@h W]$[e[0m]' 

जाहिर है एकल उद्धरण का उपयोग नहीं किया जा सकता है। एक जानवर बल समाधान पलायन उपयोग करने के लिए है, लेकिन यह काम करने के लिए मैं एक बहुत बदसूरत दिखने लाइन मिलती है:

sed -i "s/^PS1.*$/PS1='\\\\[\\\\e[1;32m\\\\][\\\\[email protected]\\\\h \\\\W]\\\\$\\\\[\\\\e[0m\\\\]'/g" /etc/skel/.bashrc 

मैं (बाह्य फ़ाइलों का उपयोग नहीं) स्क्रिप्ट पठनीय और आत्म निहित होना चाहता हूँ। उपर्युक्त के लिए कोई विकल्प?

+0

रेगेक्स की तरह किसी भी चीज के आसपास एकल कोट्स का उपयोग करें जब तक कि आपको स्ट्रिंग में इंटरफेरेटेड कुछ चर की आवश्यकता न हो। फिर भी, अधिकांश रेगेक्स के आस-पास एकल उद्धरणों का उपयोग करें, और केवल उस भाग के चारों ओर डबल कोट्स का उपयोग करें जिन्हें इंटरपोलेट किया जाना चाहिए। एक निर्मित उदाहरण का उपयोग करना: 'sed -e' s /\.\*'"$ 1 "'\ * \ ./ ab'" $ 2 "'c' \ '' d/'$ 3' या उन पंक्तियों के साथ कुछ। अनुक्रम '' \ '' 'है कि आप कमांड लाइन में एक एकल उद्धरण कैसे एम्बेड करते हैं; पहला एकल उद्धरण वर्तमान सिंगल-कोट अनुभाग को समाप्त करता है; बैकस्लैश-कोट स्ट्रिंग में एक एकल उद्धरण एम्बेड करता है; तीसरा एकल उद्धरण एकल उद्धरण को फिर से शुरू करता है। –

उत्तर

5

बैश का प्रिंटफ आवश्यक पलायन जोड़ सकता है, स्ट्रिंग को एक पठनीय, संपादन योग्य रूप में डालने के लिए छोड़ देता है।

sed -i "s/^PS1.*$/$(printf "%q" "PS1='\[\e[1;32m\][\[email protected]\h \W]$\[\e[0m\]'")/g" /etc/skel/.bashrc 

एक लाइन पर इसे छूने की कोशिश नहीं कर रहा है, पूरी चीज स्पष्ट हो जाती है।

REPL=$(printf "%q" "PS1='\[\e[1;32m\][\[email protected]\h \W]$\[\e[0m\]'") 
sed -i "s/^PS1.*$/$REPL/g" /etc/skel/.bashrc 
1

sed -f के साथ एक sed स्क्रिप्ट फ़ाइल का उपयोग करें। यह विकल्प सुंदर भी नहीं है, क्योंकि इसका मतलब है कि एक अतिरिक्त फाइल आसपास झूठ बोल रही है, लेकिन कम से कम आप शैल से बचने से बचें।

+0

बाहरी फ़ाइलों का उपयोग नहीं करना चाहते हैं। – hauptmech

+0

आप यहां कुछ 'sed' कार्यान्वयन के साथ एक दस्तावेज़ का उपयोग कर सकते हैं, यानी' sed -f - << 'EOF'' – tripleee

4

यह आप के लिए काम कर सकते हैं:

echo "PS1=abc" | 
sed 's/^PS1.*$/PS1='\''\\[\\e[1;32m\\][\\[email protected]\\h \\W]\\$\\[\\e[0m\\]'\''/' 
PS1='\[\e[1;32m\][\[email protected]\h \W]\$\[\e[0m\]' 
+0

+1 सिंगल कोट्स जाने का तरीका है। – tripleee

+0

मुझे सिंगल कोट्स को चुनना मुश्किल लगता है, साथ ही प्रतिस्थापन स्ट्रिंग को बचने की आवश्यकता है जो इसे पढ़ने में थोड़ा मुश्किल बनाता है। – hauptmech

1

इस बारे में कैसे:

sed -i 's/^PS1.*$/PS1=SINGLEQUOTESLASH[SLASHe[1;32mSLASH][[email protected] SLASHW]SLASH$SLASH[SLASHe[0mSLASH]SINGLEQUOTE/g' /etc/skel/.bashrc 
sed -i "s/SINGLEQUOTE/'/g" /etc/skel/.bashrc 
sed -i "s/SLASH/\\/g" /etc/skel/.bashrc 

दो गुजरता में यह कर कम कुशल है, लेकिन कुछ और माइक्रोसेकंड ज्यादातर लोगों के लिए unnoticeable है।

+0

मुझे यह पसंद है कि यह कहां जा रहा है लेकिन sed को बचने की जरूरत है ... इसलिए यह वास्तव में वांछित आउटपुट का उत्पादन नहीं करता है। – hauptmech

+0

@hauptmech मैंने इसे '\' के बजाय SLASH का उपयोग करने के लिए संपादित किया है। यद्यपि अब थोड़ा कम सुगम दिखता है। आप पाइथन, या पर्ल का उपयोग कर बेहतर हो सकता है –

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