पहले से ही उद्धरणों से घिरे एक sed अभिव्यक्ति में किसी एकल उद्धरण से कैसे बचें?
उदाहरण के लिए:
sed 's/ones/one's/' <<< 'ones thing'
पहले से ही उद्धरणों से घिरे एक sed अभिव्यक्ति में किसी एकल उद्धरण से कैसे बचें?
उदाहरण के लिए:
sed 's/ones/one's/' <<< 'ones thing'
जवाबों:
sed
दोहरे उद्धरण चिह्नों के साथ उद्धरण कोड:
$ sed "s/ones/one's/"<<<"ones thing"
one's thing
मुझे सैकड़ों बैकस्लैश के साथ कोड से बचना पसंद नहीं है - मेरी आँखों में दर्द होता है। आमतौर पर मैं इस तरह से करता हूं:
$ sed 's/ones/one\x27s/'<<<"ones thing"
one's thing
sed -i
किसी विशेष कारण के साथ काम नहीं करता है ?
एक चाल आसन्न तारों के खोल स्ट्रिंग संघनन का उपयोग करना है और खोल से बचने के लिए एम्बेडेड बोली से बचना है:
sed 's/ones/two'\''s/' <<< 'ones thing'
two's thing
सीड एक्सप्रेशन में 3 स्ट्रिंग्स हैं, जो शेल फिर एक साथ टांके लगाते हैं:
sed 's/ones/two'
\'
's/'
आशा है कि किसी और की मदद करता है!
sed 's/ones/two''s/' <<< 'ones thing'
नहीं, यह आउटपुट है twos thing
। यह '
आउटपुट में गायब है । आपको इसे इस उत्तर में वर्णित तरीके से करना होगा।
उपयोग करने का सबसे अच्छा तरीका है $'some string with \' quotes \''
उदाहरण के लिए:
sed $'s/ones/two\'s/' <<< 'ones thing'
$'string'
बैश-विशिष्ट है, इसलिए यह POSIX शेल के लिए पोर्टेबल नहीं है।
bash
विशिष्ट नहीं है । यह में भी उपलब्ध है ksh
और zsh
है, लेकिन हाँ, यह POSIX, के लिए एक विस्तार है जो ठीक है अगर आप एक पोर्टेबल पटकथा लिख नहीं कर रहे हैं। केवल नकारात्मक पक्ष यह है कि आपको किसी भी अन्य बैकस्लैश से बचना होगा जो आप उपयोग करते हैं।
बस sed कमांड के बाहर डबल कोट्स का उपयोग करें।
$ sed "s/ones/one's/" <<< 'ones thing'
one's thing
यह फाइलों के साथ भी काम करता है।
$ echo 'ones thing' > testfile
$ sed -i "s/ones/one's/" testfile
$ cat testfile
one's thing
यदि आपके पास स्ट्रिंग के अंदर एकल और दोहरे उद्धरण हैं, तो यह ठीक है। बस दोहरे उद्धरण चिह्नों से बच जाते हैं।
उदाहरण के लिए, इस फ़ाइल में सिंगल और डबल कोट्स दोनों के साथ एक स्ट्रिंग है। मैं एक एकल उद्धरण जोड़ने और कुछ दोहरे उद्धरण निकालने के लिए sed का उपयोग करूँगा।
$ cat testfile
"it's more than ones thing"
$ sed -i "s/\"it's more than ones thing\"/it's more than one's thing/" testfile
$ cat testfile
it's more than one's thing
यह बेतुका की तरह है, लेकिन मैं नहीं मिल सका \'
में sed 's/ones/one\'s/'
काम करने के लिए। मैं इसे एक शेल स्क्रिप्ट बनाने के लिए देख रहा था जो स्वचालित रूप import 'hammerjs';
से मेरी src/main.ts
फ़ाइल में कोणीय के साथ जोड़ देगा ।
मुझे जो काम करने को मिला वह यह है:
apost=\'
sed -i '' '/environments/a\
import '$apost'hammerjs'$apost';' src/main.ts
तो ऊपर के उदाहरण के लिए, यह होगा:
apost=\'
sed 's/ones/one'$apost's/'
मुझे नहीं पता कि \'
खुद से काम क्यों नहीं होगा, लेकिन यह वहाँ है।
मुझे पता है कि यह एक पुलिस वाले की तरह लग रहा है, लेकिन मैं कभी भी सेड काम नहीं कर सकता था जब स्ट्रिंग में सिंगल और डबल दोनों उद्धरण थे। मेरे जैसे किसी भी नए शौक की मदद करने के लिए जो मुसीबत में हैं, एक विकल्प स्ट्रिंग को विभाजित करना है। मुझे 100 से अधिक index.hmtl फ़ाइलों में कोड को बदलना पड़ा। स्ट्रिंग्स में सिंगल और डबल दोनों कोट्स थे इसलिए मैंने सिर्फ स्ट्रिंग को विभाजित किया और पहले ब्लॉक को बदल दिया
<!--
और दूसरे ब्लॉक को -->
। इसने मेरी index.html फ़ाइलों की गड़बड़ी की लेकिन यह काम कर गई।
विभिन्न स्लेश के साथ भ्रम से बचने के लिए ":" जैसे वैकल्पिक स्ट्रिंग सेपरेटर का उपयोग करें
sed "s:ones:one's:" <<< 'ones thing'
या यदि आप एकल बोली को हाईलाइज करना चाहते हैं
sed "s:ones:one\'s:" <<< 'ones thing'
दोनों लौट आए
one's thing