जाग के अंदर एक भी बोली से कैसे बच सकते हैं


111

मैं निम्नलिखित कार्य करना चाहता हूं

awk 'BEGIN {FS=" ";} {printf "'%s' ", $1}'

लेकिन इस तरह से एकल उद्धरण से बचना काम नहीं करता है

awk 'BEGIN {FS=" ";} {printf "\'%s\' ", $1}'

यह कैसे करना है? सहायता के लिए धन्यवाद।


उनमें से दो को एक पंक्ति में रखकर कई भाषाएं उद्धरणों से बच जाती हैं, शायद यही कोशिश करते हैं।
joshuahealy

मैंने 'BEGIN {FS = "";} {printf "'% s ''", $ 1} 'को जगाने की कोशिश की, लेकिन एक भी उद्धरण नहीं छपा।

यह पृष्ठ कहता है कि एकल-उद्धृत स्ट्रिंग में एक एकल उद्धरण सहित असंभव है। शायद आपको दोहरे उद्धरण चिह्नों में बदलना होगा।
२०:२४ पर जोशैअली

2
यह असंभव है, लेकिन दो आसन्न एकल-उद्धृत शेल तार एक पैरामीटर में एक साथ गोंद करते हैं। और गैर-व्हाट्सएप पात्रों द्वारा चिपके दो एकल-उद्धृत शैल तार भी एक बड़े ग्लोब में गोंद करते हैं: 'abc'd'ef'है abcdef: शाब्दिक प्लस dप्लस शाब्दिक। dउद्धरण के बाहर है, और आप की जगह ले सकता है कि dइसके साथ \'बनाने के लिए 'abc'\''ef'करने के लिए जो मूल्यांकन करता है abc'ef
कज़

जवाबों:


160

शायद यह वही है जो आप ढूंढ रहे हैं:

awk 'BEGIN {FS=" ";} {printf "'\''%s'\'' ", $1}'

यही है, '\''आप उद्घाटन को बंद करने के साथ ', फिर 'इसे छोड़कर एक शाब्दिक प्रिंट करें और अंत में 'फिर से खोलें ।


48
इसका जागरण से कोई लेना-देना नहीं है। 'चरित्र उद्घाटन बंद कर देता है 'खोल स्ट्रिंग शाब्दिक। शेल शाब्दिक इसके लिए बैकस्लैश से बचने का समर्थन नहीं करता है। अनुक्रम '\''काम कर देता है: यह एकल बोली शाब्दिक, निर्दिष्ट उद्धरण कैरेक्टर (कि बचने का उपयोग कर बंद कर देता है है और उसके बाद एकल बोली शाब्दिक के बाहर समर्थित) को फिर से खुल जाता है एक नए एकल-बोली शाब्दिक। आप इसे एकल उद्धरण प्राप्त करने के लिए चार-वर्ण भागने के अनुक्रम के रूप में सोच सकते हैं। :)
काज

2
@ पाठ: आपके बहुत उपयोगी उत्तर के लिए बहुत बहुत धन्यवाद। आपने मुझे बहुत सिरदर्द से बचाया!
जॉन सलेगर्स

4
@syntaxerror आप इनवॉइस के लिए तर्क तैयार करने के लिए किन उद्धरणों का उपयोग करते awkहैं, शुद्ध रूप से कमांड इंटरप्रेटर का उपयोग करने के लिए आप कमांड लाइनों की रचना करने की बात करते हैं। '{printf $2}'एक के लिए कुछ तर्क में बदल जाता है execveसिस्टम कॉल या इसी तरह की है, जहां यह सिर्फ किसी एक उद्धरण के बिना एक अशक्त समाप्त सी स्ट्रिंग की तरह दिखता है। अवाक कभी भी उद्धरण नहीं देखता है, और न ही sed। आप वास्तव में दोहरे उद्धरण चिह्नों का उपयोग कर सकते हैं, लेकिन दोहरे उद्धरण गोले के विस्तार को नहीं रोकते हैं $2, इसलिए आपको इसे शाब्दिक बनाने के लिए एक बैकस्लैश के साथ डॉलर के चिह्न से बचना होगा "{printf \$2}":।
कज़

4
@syntaxerror कस्टम द्वारा, एक इन-लाइन awk स्क्रिप्ट आमतौर पर सिंगल कोट्स के साथ बच जाती है, क्योंकि awk सिंटैक्स में अक्सर शाब्दिक तत्व होते हैं जो शेल के लिए विशेष होते हैं, जैसे कि डबल उद्धृत स्ट्रिंग लिटरल, और डॉलर के संकेतों द्वारा निरूपित संख्या। यदि एक सीड रेगुलर एक्सप्रेशन (या जो भी) में शेल सिंटैक्स होता है, तो आपको भी सावधान रहना होगा। sed -e "s/$FOO/$BAR/"अगर इरादे शाब्दिक पाठ बदलने के लिए है काम नहीं करेगा $FOOसाथ $BAR। सबसे आसान तरीका होगा sed -e 's/$FOO/$BAR/
कज़

1
@syntaxerror यदि आप जागृत कार्यक्रमों को दोहरे उद्धरण चिह्नों में शामिल करते हैं, तो आप बहुत से भागने में भाग लेंगे, जैसे awk "{ print \"abc\", \$1 }"। किसी भी समय जागृत कार्यक्रम में एक डबल उद्धरण प्रकट होता है, इसे बचाना होगा ताकि यह शेल उद्धरण को बंद न करे। और इसकी तुलना करें: awk '{print "\\"}'(बैकस्लैश प्रिंट करें) बनाम यह दोहरे उद्धरणों के साथ क्या लेता है:, awk "BEGIN {print \"\\\\\" }"पाब्लो! दोनों उद्धरणों से बचना होगा, और दोनों बैकस्लैश। शेल धर्मान्तरित \\ होता है \ इसलिए हमें \\\\ सांकेतिक शब्दों में बदलना चाहिए \\
काज

76

एक एकल उद्धरण का उपयोग करके प्रतिनिधित्व किया जाता है \x27

जैसे की

awk 'BEGIN {FS=" ";} {printf "\x27%s\x27 ", $1}'

स्रोत


16
+1, लेकिन जोड़ने की आवश्यकता है: \x27एक विस्तार है; POSIX Awk केवल पहचानता है \047। ( \47ठीक भी है अगर एक अष्टक अंक का पालन नहीं किया जाता है।)
हेमफ्लिट

1
यदि आपके पास इसके बाद एक और नंबर है, तो आप \ x27 को कैसे समाप्त करेंगे?
जेसन एक्सलसन

1
जेसन, आप दो स्ट्रिंग शाब्दिकों को समेटते हैं: "AAA \ x27" "1"। या आप सिर्फ अष्टधातु का उपयोग करें।
हेमफ्लिट

9
हमेशा ऑक्टल ( \047) का उपयोग करें , हेक्स का नहीं ( \x27), एस्केप कोड - awk.freeshell.org/PrintASing.Quote देखें ।
एड मॉर्टन

35

एक अन्य विकल्प एक उद्धरण को एक चर के रूप में पारित करना है :

awk -v q=\' 'BEGIN {FS=" ";} {printf "%s%s%s ", q, $1, q}'

स्ट्रिंग संघनन के साथ सरल उदाहरण:

# Prints 'test me', *including* the single quotes.
$ awk -v q=\' '{print q $0 q }' <<<'test me'
'test me'

5
यह स्पष्ट और संक्षिप्त है, खासकर यदि आपको कई उद्धरणों का उपयोग करने की आवश्यकता है।
पीटर ग्लुक


4

छोटी लिपियों के लिए इसे पढ़ने योग्य बनाने का एक वैकल्पिक तरीका इस तरह से एक चर का उपयोग करना है:

awk -v fmt="'%s'\n" '{printf fmt, $1}'

मुझे पता चला कि यह एक ऐसे मामले में बुलाया गया था, जहाँ मुझे आउटपुट में कई बार एकल-भाव वाले चरित्र का निर्माण करना पड़ा और \ 047 इसे पूरी तरह से अपठनीय बना रहे थे

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