कैसे sed में एकल उद्धरण से बचने के लिए?


93

पहले से ही उद्धरणों से घिरे एक sed अभिव्यक्ति में किसी एकल उद्धरण से कैसे बचें?

उदाहरण के लिए:

sed 's/ones/one's/' <<< 'ones thing'


1
संक्षिप्त उत्तर है " आप ऐसा नहीं कर सकते हैं " - वर्कअराउंड सभी काम को अच्छी तरह से प्रस्तुत करता है।
ग्लेन जैकमैन

जवाबों:


154

sedदोहरे उद्धरण चिह्नों के साथ उद्धरण कोड:

    $ sed "s/ones/one's/"<<<"ones thing"   
    one's thing

मुझे सैकड़ों बैकस्लैश के साथ कोड से बचना पसंद नहीं है - मेरी आँखों में दर्द होता है। आमतौर पर मैं इस तरह से करता हूं:

    $ sed 's/ones/one\x27s/'<<<"ones thing"
    one's thing

7
यह sed -iकिसी विशेष कारण के साथ काम नहीं करता है ?
समको ५

1
यह ध्यान दिया जाना चाहिए कि डबल कोट्स के साथ आस-पास की सीड कमांड उन कमांड को शेल द्वारा प्रक्षेपित करने की अनुमति देती है और अप्रत्याशित समस्याएं पैदा कर सकती हैं।
पोटोंग

38

एक चाल आसन्न तारों के खोल स्ट्रिंग संघनन का उपयोग करना है और खोल से बचने के लिए एम्बेडेड बोली से बचना है:

sed 's/ones/two'\''s/' <<< 'ones thing'

two's thing

सीड एक्सप्रेशन में 3 स्ट्रिंग्स हैं, जो शेल फिर एक साथ टांके लगाते हैं:

sed 's/ones/two'

\'

's/'

आशा है कि किसी और की मदद करता है!


शायद एक आसान संस्करण: sed 's / ones / two''s /' <<< 'वाली बात'
gregory

@ समूहिक: sed 's/ones/two''s/' <<< 'ones thing'नहीं, यह आउटपुट है twos thing। यह 'आउटपुट में गायब है । आपको इसे इस उत्तर में वर्णित तरीके से करना होगा।
वारबैंक

@wisbucky z के साथ मैं sed (FreeBSD / macOS) का उपयोग कर रहा हूँ, यह निश्चित रूप से "दो की बात" है।
ग्रेगरी

मुझे पता है, खोल तो एक साथ टांके लगाकर महान मदद आदमी।
प्रतीक गुप्ता

7

उपयोग करने का सबसे अच्छा तरीका है $'some string with \' quotes \''

उदाहरण के लिए:

sed $'s/ones/two\'s/' <<< 'ones thing'

3
C- शैली $'string'बैश-विशिष्ट है, इसलिए यह POSIX शेल के लिए पोर्टेबल नहीं है।
ट्रिपल डे

यह bashविशिष्ट नहीं है । यह में भी उपलब्ध है kshऔर zshहै, लेकिन हाँ, यह POSIX, के लिए एक विस्तार है जो ठीक है अगर आप एक पोर्टेबल पटकथा लिख नहीं कर रहे हैं। केवल नकारात्मक पक्ष यह है कि आपको किसी भी अन्य बैकस्लैश से बचना होगा जो आप उपयोग करते हैं।
dannyw

7

बस 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

धन्यवाद! मैं रेगेक्स से प्यार करता हूं, सेड से प्यार करता हूं और अब मैं आपसे प्यार करता हूं <3
गैब्रियल ए। ज़ोरिल्ला

3

यह बेतुका की तरह है, लेकिन मैं नहीं मिल सका \'में 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/'

मुझे नहीं पता कि \'खुद से काम क्यों नहीं होगा, लेकिन यह वहाँ है।



0

मुझे पता है कि यह एक पुलिस वाले की तरह लग रहा है, लेकिन मैं कभी भी सेड काम नहीं कर सकता था जब स्ट्रिंग में सिंगल और डबल दोनों उद्धरण थे। मेरे जैसे किसी भी नए शौक की मदद करने के लिए जो मुसीबत में हैं, एक विकल्प स्ट्रिंग को विभाजित करना है। मुझे 100 से अधिक index.hmtl फ़ाइलों में कोड को बदलना पड़ा। स्ट्रिंग्स में सिंगल और डबल दोनों कोट्स थे इसलिए मैंने सिर्फ स्ट्रिंग को विभाजित किया और पहले ब्लॉक को बदल दिया <!--और दूसरे ब्लॉक को -->। इसने मेरी index.html फ़ाइलों की गड़बड़ी की लेकिन यह काम कर गई।


0

AppleMacOSX टर्मिनलों पर कुछ भागने में विफल:

sed 's|ones|one'$(echo -e "\x27")'s|1' <<<'ones thing'


0

विभिन्न स्लेश के साथ भ्रम से बचने के लिए ":" जैसे वैकल्पिक स्ट्रिंग सेपरेटर का उपयोग करें

sed "s:ones:one's:" <<< 'ones thing'

या यदि आप एकल बोली को हाईलाइज करना चाहते हैं

sed "s:ones:one\'s:" <<< 'ones thing'

दोनों लौट आए

one's thing
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.