Zsh उपनाम में बचने उद्धरण


12

पाठ से नए अंक निकालने के बारे में इस सवाल के बाद , मैं इसे एक ज़ीश उपनाम में बदलना चाहता हूं:

alias striplines=' awk " /^$/ {print \"\n\"; } /./ {printf( \" %s \",$0);}"'

मैंने awk स्क्रिप्ट के अंदर उद्धरणों से बचने की कोशिश की है, लेकिन मुझे यह त्रुटि मिल रही है:

awk: (FILENAME=bspsrobustness FNR=1) fatal: division by zero attempted

(फ़ाइल कहा जाता है bspsrobustness)

वहाँ एक रास्ता है कि मैं क्या चाहता हूँ? मुझे लगता है कि मैं इसे एक ज़िश अलियास के बजाय एक अजीब स्क्रिप्ट में बदल सकता हूं, क्या यह मेरा सबसे अच्छा विकल्प है?


वैसे, यह सभी पर लागू होता है (बॉर्न-शैली, न कि शश) गोले।
गिल्स एसओ- बुराई को रोकना '

जवाबों:


9

आप एक उपनाम के बजाय एक zsh फ़ंक्शन का उपयोग कर सकते हैं। के माध्यम से कूद करने के लिए कोई उद्धरण हुप्स।

striplines() {
    awk '... awk body "with quotes" ...' "$@"
}

और फिर मैं इसे कैसे कहूंगा striplines filename:?
सीमियस

क्या आप बता सकते हैं कि क्या "$@"कर रहा है?
सीमस

@ सीमस, हाँ आप इसे बिल्कुल वैसा ही कहेंगे। "$@"वाक्य रचना awk को striplines तर्कों तक अछूता भेजता है - आवश्यक हो तो कहते हैं, अपने फ़ाइल नाम का कोई भी रिक्तियां: striplines "file 1" "file 2"awk करने के लिए दो फ़ाइल नाम भेजा होगा।
बजे ग्लेन जैकमैन

5

क्या चल रहा है, इसका अंदाजा लगाने के लिए

% alias striplines='print -lr awk " /^$/ {print \"\n\"; } /./ {printf( \" %s \",$0);}"'
% striplines
awk
 /^$/ {print "\n"; } /./ {printf( " %s ",zsh);}

चूंकि $वर्ण दोहरे उद्धरण में हैं (जब वे उर्फ ​​विस्तार के बाद विस्तारित होते हैं), उन्हें शेल द्वारा व्याख्या किया जाता है। उद्धरण को सही पाने के लिए, पूरे उपनाम की परिभाषा को एकल उद्धरण में रखना आसान है। एकल उद्धरण के अंदर क्या है, जब उपनाम का उपयोग किया जाता है तो विस्तार किया जाएगा। अब जब यह तर्क awkदोहरे उद्धरण चिह्नों में घिरा हुआ है, तो यह स्पष्ट है कि आपको बैकस्लैश की आवश्यकता है \"$

alias striplines='print -lr awk " /^\$/ {print \"\n\"; } /./ {printf( \" %s \",\$0);}"'

सिंगल-कोटेड स्ट्रिंग को सिंगल-कोट करने के लिए एक उपयोगी मुहावरा यह है कि एक सिंगल-क्वैड स्ट्रिंग में '\''शाब्दिक एकल उद्धरण डालने का एक तरीका है। तकनीकी रूप से एकल-उद्धृत स्ट्रिंग, बैकस्लैश-उद्धृत 'और अन्य एकल-उद्धृत स्ट्रिंग का एक जूसकप है। ''अंत में juxtaposed खाली स्ट्रिंग को हटाया जा सकता है।

alias striplines='print -lr awk '\'' /^$/ {print "\n"; } /./ {printf( " %s ",$0);}'\'

इस लंबे स्पष्टीकरण के बाद, एक सिफारिश: जब यह एक उपनाम के लिए बहुत जटिल है, तो एक फ़ंक्शन का उपयोग करें

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