2013-06-29 4 views
8

मैं सख्त डबल बैकस्लैश के साथ एक फ़ॉर्वर्ड स्लैश (/) दोहरे उद्धरण चिह्नों ("\\")आगे बदलें डबल बैकस्लैश डबल उद्धरण में संलग्न के साथ स्लेश

लेकिन

a=`echo "$var" | sed 's/^\///' | sed 's/\//\"\\\\\"/g'` 

नहीं है में संलग्न को बदलने के लिए कोशिश कर रहा हूँ काम, और मुझे नहीं पता क्यों। यह हमेशा एक बैकस्लैश के साथ बदलता है और दो

उत्तर

20

जब / किसी रेगुलर एक्सप्रेशन का हिस्सा है कि आप sed की s (विकल्प) कमांड के साथ बदलना चाहते है, तो आप एक अन्य चरित्र का उपयोग करने के बजाय कर सकते हैं आदेश के वाक्य रचना में स्लेश, तो आप लिखते हैं, उदाहरण के लिए:

sed 's,/,\\\\,g' 

, ऊपर अमूमन के बजाय इस्तेमाल किया गया था s कमांड के दो पैरामीटर को डिलीमिट करने के लिए अल स्लैश: भाग को प्रतिस्थापित करने के लिए नियमित अभिव्यक्ति और स्ट्रिंग को प्रतिस्थापन के रूप में उपयोग करने के लिए वर्णित किया गया है।

उपर्युक्त दो स्लैश के साथ प्रत्येक स्लैश को प्रतिस्थापित करेगा। बैकस्लैश एक विशेष (उद्धरण) चरित्र है, इसलिए इसे उद्धृत किया जाना चाहिए, यहां इसे स्वयं उद्धृत किया गया है, यही कारण है कि हमें दो बैकस्लेश का प्रतिनिधित्व करने के लिए 4 बैकस्लाश की आवश्यकता है।

$ echo /etc/passwd| sed 's,/,\\\\,g' 
\\etc\\passwd 
14

इस बारे में कैसे? एक खोल में

a=${var//\//\\\\} 

डेमो:

$ var=a/b/c 
$ a=${var//\//\\\\} 
$ echo "$a" 
a\\b\\c 
+1

अच्छा लगा। मुझे तब तक एहसास नहीं हुआ जब तक मैंने देखा कि प्रतिस्थापन की शुरुआत में दूसरा फॉरवर्ड स्लैश जोड़ने से यह वैश्विक बन जाता है। बहुत उपयोगी! –

+0

busybox ash (BusyBox v1.21.1, v1.22.1) में '/' प्रतिस्थापन $ a = abc/abc/abc $ echo $ {// // c/_} ab_/ab_/ab_ $ echo $ {a // \ // _} एबीसी/एबीसी/एबीसी – yurenchen

0

यह ऐसा करने का एक और तरीका है: tr '/' '\'

$ var=a/b/c 
$ echo "$var" 
a/b/c 
$ tr '/' '\' <<< "$var" 
a\b\c 
संबंधित मुद्दे