क्या प्रतिस्थापन स्ट्रिंग की व्याख्या करने से सेड को रोकने का कोई तरीका है? [बन्द है]


16

यदि आप किसी कीवर्ड को स्ट्रिंग का उपयोग करके सीड के साथ बदलना चाहते हैं, तो सीड आपके प्रतिस्थापन स्ट्रिंग की व्याख्या करने के लिए कड़ी मेहनत करता है। यदि प्रतिस्थापन स्ट्रिंग में ऐसे अक्षर होते हैं, जो sed विशेष मानता है, जैसे '/' वर्ण, तो यह विफल हो जाएगा, जब तक कि आप का अर्थ यह नहीं है कि आपके प्रतिस्थापन स्ट्रिंग में ऐसे वर्ण हैं जो sed को बताते हैं कि कैसे कार्य करना है।

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

VAR="hi/"

sed "s/KEYWORD/$VAR/g" somefile

क्या कोई ऐसा तरीका है जो विशेष वर्णों के लिए प्रतिस्थापन स्ट्रिंग की व्याख्या करने की कोशिश नहीं करने के लिए sed को बताता है? मैं बस यही चाहता हूं कि किसी वैरिएबल की सामग्री के साथ फाइल में एक कीवर्ड को बदलने में सक्षम हो, चाहे वह कोई भी सामग्री हो।


यदि आप विशेष पात्रों को रखना चाहते हैं sedऔर उनके लिए विशेष नहीं हैं, तो बस बैकस्लैश उनसे बच जाते हैं। VAR='hi\/'ऐसी कोई समस्या नहीं देता है।
वाइल्डकार्ड

6
सभी उतार क्यों? यह मुझे पूरी तरह से उचित सवाल लगता है
रोआमा

sed(1)बस यह क्या हो जाता है की व्याख्या करता है। आपके मामले में, यह एक शेल प्रक्षेप के माध्यम से हो जाता है। मेरा मानना ​​है कि आप जैसा चाहें वैसा नहीं कर सकते हैं, लेकिन मैनुअल की जांच करें। मैं पर्ल में जानता हूं (जो एक sedबहुत ही नियमित नियमित अभिव्यक्ति के साथ एक निष्क्रिय प्रतिस्थापन करता है ) आप निर्दिष्ट कर सकते हैं एक स्ट्रिंग को शाब्दिक रूप से लिया जाना है, फिर से, मैनुअल की जांच करें।
वॉनब्रांड

जवाबों:


5

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

export VAR='hi/'
perl -p -e 's/KEYWORD/$ENV{VAR}/g' somefile

यदि आप चर को हर जगह निर्यात नहीं करना चाहते हैं, तो इसे केवल उस प्रक्रिया के लिए प्रदान करें:

PATTERN="$VAR" perl -p -e 's/KEYWORD/$ENV{PATTERN}/g' somefile

ध्यान दें, कि पर्ल की नियमित अभिव्यक्ति वाक्यविन्यास डिफ़ॉल्ट रूप से सेड से थोड़ी अलग है।


यह बहुत ही आशाजनक लग रहा था, लेकिन इसका परीक्षण करते समय, मुझे "तर्क सूची बहुत लंबी" त्रुटि मिलती है क्योंकि मेरा प्रतिस्थापन स्ट्रिंग बहुत लंबा है, जो समझ में आता है - इस पद्धति का उपयोग करते हुए, हम पूरे प्रतिस्थापन स्ट्रिंग का उपयोग उन तर्कों के भाग के रूप में कर रहे हैं जो हम देते हैं perl के लिए, इसलिए इसकी सीमा है कि यह कितने समय तक हो सकता है।
ताल

1
नहीं, यह PATTERN पर्यावरण के चर में जाएगा , तर्कों से नहीं। किसी भी स्थिति में, यह त्रुटि होगी E2BIG, जिसका उपयोग करने पर आपको समान रूप से मिलेगा sed
अंती हापला १ '

4

वहाँ प्रतिस्थापन भाग में केवल 4 विशेष वर्ण हैं: \, &, न्यू लाइन और सीमांकक ( रेफरी )

$ VAR='abc/def&ghi\foo
next line'

$ repl=$(sed -e 's/[&\\/]/\\&/g; s/$/\\/' -e '$s/\\$//' <<<"$VAR")

$ echo "$repl"
abc\/def\&ghi\\foo\
next line

$ echo ZYX | sed "s/Y/$repl/g"
Zabc/def&ghi\foo
next lineX

इसमें एंट्टी के समाधान के समान समस्या है - यदि प्रतिस्थापन स्ट्रिंग एक निश्चित लंबाई है, तो आपको "तर्क सूची" बहुत लंबी "त्रुटि" मिलती है। इसके अलावा, क्या होगा अगर प्रतिस्थापन स्ट्रिंग में '[', ']', '*', ',' और ऐसे अन्य अक्षर हैं? क्या वास्तव में उन लोगों की व्याख्या नहीं होगी?
ताल

के प्रतिस्थापन की ओर s///है नहीं एक रेगुलर एक्सप्रेशन, यह वास्तव में (बैकस्लैश-पलायन के लिए और को छोड़कर सिर्फ एक स्ट्रिंग है &)। यदि प्रतिस्थापन स्ट्रिंग इतनी लंबी है, तो एक शेल-लाइनर आपका समाधान नहीं है।
ग्लेन जैकमैन

एक बहुत ही उपयोगी सूची यदि, उदाहरण के लिए, आपका प्रतिस्थापन स्ट्रिंग बेस 64 एनकोडेड टेक्स्ट है (उदाहरण के लिए एक SHA256 कुंजी के साथ एक प्लेसहोल्डर की जगह)। तो फिर यह चिंता करने के लिए परिसीमन है।
हीथ राफेरी

2

सबसे सरल समाधान जो अभी भी चर मानों के विशाल बहुमत को सही ढंग से संभाल लेगा, गैर-मुद्रण वर्ण का उपयोग एक सीमांकित sedविकल्प विकल्प के रूप में किया जाएगा।

में viआप टाइप करना Ctrl-V द्वारा कोई नियंत्रण चरित्र बच सकते हैं (और अधिक सामान्यतः के रूप में लिखा ^V)। इसलिए यदि आप कुछ नियंत्रण चरित्र का उपयोग करते हैं (मैं अक्सर ^Aइन मामलों में एक सीमांकक के रूप में उपयोग करता हूं ) तो आपकी sedकमांड केवल तभी टूटेगी जब आप उस गैर-वर्णक चरित्र को उस चर में मौजूद होते हैं जिसे आप छोड़ रहे हैं।

तो आप टाइप करेंगे "s^V^AKEYWORD^V^A$VAR^V^Ag"और आपको क्या मिलेगा (इन vi) जैसा दिखेगा:

sed "s^AKEYWORD^A$VAR^Ag" somefile

यह तब तक काम करेगा जब तक $VARइसमें नॉन-प्रिंटिंग कैरेक्टर शामिल नहीं हो जाता है- ^Aजो अत्यधिक संभावना नहीं है।


बेशक, यदि आप उपयोगकर्ता के इनपुट को मूल्य में बदल रहे हैं $VAR, तो सभी दांव बंद हैं और आप औसत उपयोगकर्ता के लिए टाइप करने के लिए कठिन होने वाले नियंत्रण वर्णों पर निर्भर होने के बजाय अपने इनपुट को पूरी तरह से बेहतर कर सकते हैं।


हालांकि, वास्तव में सीमांकक स्ट्रिंग की तुलना में अधिक सावधान रहना है। उदाहरण के लिए, &जब प्रतिस्थापन स्ट्रिंग में उपस्थित होता है, तो इसका अर्थ है "पूरे पाठ का मिलान किया गया।" उदाहरण के लिए, s/stu../my&/"मिस्ट्रीफ", "स्टंग" को "मिस्ट्रुंग" आदि के साथ "स्टफ" से बदल देंगे, इसलिए यदि आपके पास वेरिएबल में कोई भी चरित्र हो सकता है जिसे आप प्रतिस्थापन स्ट्रिंग के रूप में छोड़ रहे हैं, लेकिन आप शाब्दिक का उपयोग करना चाहते हैं केवल वैरिएबल का मान, तब आपके पास कुछ ऐसा परिवर्तन करने से पहले आपके पास सैनिटाइजिंग करने के लिए वैरिएबल स्ट्रिंग के रूप में उपयोग कर सकते हैं sed। (डेटा सैनिटाइज़िंग के साथ sedभी किया जा सकता है , हालांकि)


यह मेरी तरह का है - एक स्ट्रिंग को दूसरे स्ट्रिंग के साथ बदलना एक बहुत ही सरल ऑपरेशन है। क्या यह वास्तव में जटिल होने की जरूरत है कि कौन से वर्ण सेड को पसंद नहीं करेंगे, और अपने स्वयं के इनपुट को सैनिटाइज करने के लिए sed का उपयोग कर रहे हैं? यह हास्यास्पद और अनावश्यक रूप से जटिल लगता है। मैं एक पेशेवर प्रोग्रामर नहीं हूं, लेकिन मुझे पूरा यकीन है कि मैं एक छोटे से फंक्शन को कोड कर सकता हूं जो एक कीवर्ड को स्ट्रिंग के साथ बहुत अधिक किसी भी भाषा में बदल देता है जिसमें मैं कभी भी आया हूं, जिसमें बैश भी शामिल है - मैं बस एक सरल लिनक्स की उम्मीद कर रहा था मौजूदा उपकरणों का उपयोग कर समाधान - मुझे विश्वास नहीं हो सकता है कि वहाँ कोई नहीं है।
ताल

1
@ ताल, अगर आपका प्रतिस्थापन स्ट्रिंग "100 पेज लंबा है" जैसा कि आप एक अन्य टिप्पणी में उल्लेख करते हैं ... आप इसे "सरल" उपयोग मामला कह सकते हैं। यहाँ जवाब पर्ल है, वैसे - मैंने अभी पर्ल नहीं सीखा है। यहां जटिलता इस तथ्य से आती है कि आप किसी भी मनमाने ढंग से इनपुट को एक रेगेक्स में प्रतिस्थापन स्ट्रिंग के रूप में अनुमति देना चाहते हैं ।
वाइल्डकार्ड

कई अन्य समाधान हैं जिनका आप उपयोग कर सकते हैं, उनमें से कई बहुत सरल हैं। उदाहरण के लिए, अपने प्रतिस्थापन स्ट्रिंग वास्तव में लाइन आधारित है और पर डालने की जरूरत नहीं है, तो बीच एक लाइन, उपयोग की sedहै insert आदेश। लेकिन sedजटिल तरीकों से बड़ी मात्रा में पाठ को संसाधित करने के लिए एक अच्छा उपकरण नहीं है। मैं एक और उत्तर दिखाऊंगा कि यह कैसे करना है awk
वाइल्डकार्ड

1

आप ,या |इसके बजाय एक का उपयोग कर सकते हैं और यह एक सेपरेटर के रूप में ले जाएगा और तकनीकी रूप से आप कुछ भी उपयोग कर सकते हैं

मैन पेज से

\cregexpc
           Match lines matching the regular expression regexp.  The  c  may
      be any character.

जैसा कि आप देख सकते हैं कि आपको शुरुआत में अपने विभाजक से पहले एक से शुरू करना चाहिए, तो आप इसे विभाजक के रूप में उपयोग कर सकते हैं।

दस्तावेज़ से http://www.gnu.org/software/sed/manual/sed.html#The-_0022s_0022-Command :

The / characters may be uniformly replaced by any other single character 
within any given s command.

The / character (or whatever other character is used in its stead) can appear in 
the regexp or replacement only if it is preceded by a \ character.

उदाहरण:

sed -e 'somevar|s|foo|bar|'
echo "Hello all" | sed "s_all_user_"
echo "Hello all" | sed "s,all,user,"

echo "Hello/ World" | sed "s,Hello/,Neo,"


आप प्रतिस्थापन स्ट्रिंग में एकल, विशिष्ट चरित्र के उपयोग की अनुमति देने के बारे में बात कर रहे हैं - इस मामले में, "/"। मैं इसे पूरी तरह से प्रतिस्थापन स्ट्रिंग की व्याख्या करने की कोशिश करने से रोकने के बारे में बात कर रहा हूं। कोई फर्क नहीं पड़ता कि आप किस चरित्र का उपयोग करते हैं ("/", ",", "|", आदि) आप हमेशा उस चरित्र को बदलने का जोखिम लेते हैं जो प्रतिस्थापन स्ट्रिंग में पॉप अप होता है। इसके अलावा, प्रारंभिक चरित्र एकमात्र विशेष चरित्र नहीं है जो कि सेड की परवाह करता है, क्या ऐसा है?
ताल

@ इसके बजाय यह कुछ भी नहीं ले सकता है /और यह /खुशी से अनदेखा कर देगा जैसा कि मैंने अभी बताया है .. वास्तव में, आप इसे भी देख सकते हैं और इसे एक स्ट्रिंग में बदल सकते हैं >>> मैंने एक उदाहरण के साथ संपादित किया है >>> ये सामान इतना सुरक्षित नहीं है और आपको हमेशा एक स्मार्ट दोस्त मिलेगा
user3566929

@ आप इसे व्याख्या करने से क्यों रोकना चाहते हैं? मेरा मतलब है कि sedपहली जगह का उपयोग करना, आपकी परियोजना क्या है?
user3566929

मुझे एक स्ट्रिंग के साथ एक कीवर्ड को बदलना होगा। सीडक्स में ऐसा करने के लिए सीड सबसे आम तरीका लगता है। स्ट्रिंग 100 पेज लंबा हो सकता है। मैं स्ट्रिंग को साफ करने की कोशिश नहीं करना चाहता, ताकि इसे पढ़ते समय sed बाहर न निकले - मैं चाहता हूं कि यह स्ट्रिंग के किसी भी वर्ण को संभालने में सक्षम हो, और "हैंडल" से, मेरा मतलब है कि जादुई खोजने की कोशिश न करें भीतर अर्थ।
ताल

1
@Tal, bashहै नहीं स्ट्रिंग हेरफेर के लिए। सब पर, सब पर, सब। यह फ़ाइल हेरफेर और कमांड समन्वय के लिए है । यह स्ट्रिंग्स के लिए कुछ आसान कार्यक्षमता में निर्मित होता है , लेकिन वास्तव में सीमित और बहुत तेज नहीं है अगर आप मुख्य काम कर रहे हैं। देखें "पाठ को खराब अभ्यास माना जाने वाले प्रक्रिया को शेल लूप का उपयोग क्यों कर रहा है?" कुछ उपकरण है कि कर रहे हैं सबसे बुनियादी से सबसे शक्तिशाली करने के लिए पाठ संसाधन के लिए डिजाइन किए हैं, क्रम में: sed, awkऔर पर्ल।
वाइल्डकार्ड

1

यदि यह लाइन-आधारित है और केवल एक लाइन को बदलने के लिए है, तो मैं सलाह देता हूं कि फाइल को रिप्लेसमेंट लाइन के साथ प्रयोग printfकरने की सलाह दें , जो कि पहली लाइन को sedस्पेस में रखता है, और आवश्यकतानुसार इसे छोड़ देता है। इस तरह आपको विशेष पात्रों के बारे में चिंता करने की ज़रूरत नहीं है। (यहाँ केवल धारणा यह है कि $VARपाठ की एक भी पंक्ति बिना किसी नई पंक्ति के है, जो कि आपने पहले ही टिप्पणियों में कही है।) नई वर्णमाला के अलावा, VAR में कुछ भी हो सकता है और यह परवाह किए बिना काम करेगा।

VAR=whatever
{ printf '%s\n' "$VAR";cat somefile; } | sed '1{h;d;};/KEYWORD/g'

printf '%s\n'$VARइसकी सामग्री की परवाह किए बिना एक शाब्दिक स्ट्रिंग के रूप में मुद्रित करेगा , इसके बाद एक नई पंक्ति। ( echoकुछ मामलों में अन्य चीजें करेंगे, उदाहरण के लिए यदि $VARएक हाइफ़न के साथ शुरू होने वाली सामग्री - यह एक विकल्प ध्वज के रूप में व्याख्या की जाएगी echo।)

ब्रेसिज़ का उपयोग printfसामग्री के उत्पादन को रोकने के लिए किया जाता है somefileक्योंकि यह पारित हो गया है sed। व्हॉट्सएप अपने आप से घुंघराले ब्रेसिज़ को अलग करना महत्वपूर्ण है, जैसा कि बंद घुंघराले ब्रेस से पहले अर्धविराम है।

1{h;d;};के रूप में एक sedआदेश में पाठ की पहली पंक्ति स्टोर करेगा sedकी पकड़ अंतरिक्ष , तो d(बल्कि उसे प्रिंट की तुलना में) लाइन हटाएं।

/KEYWORD/निम्नलिखित क्रियाओं को उन सभी लाइनों पर लागू करता है जिनमें सम्‍मिलित हैं KEYWORD। एक्शन gएट है, जो होल्ड स्पेस की सामग्री प्राप्त करता है और इसे पैटर्न स्पेस के स्थान पर छोड़ देता है -दूसरे शब्दों में, संपूर्ण वर्तमान लाइन। (यह किसी पंक्ति के केवल भाग को प्रतिस्थापित करने के लिए नहीं है ।) होल्ड स्पेस को खाली नहीं किया जाता है, वैसे, पैटर्न स्पेस में कॉपी किया जाता है, जो कुछ भी है उसे प्रतिस्थापित करता है।

यदि आप अपने regex को एंकर करना चाहते हैं, तो यह एक लाइन से मेल नहीं खाएगा जिसमें केवल KEYWORD होता है, लेकिन केवल एक लाइन जहां लाइन पर और कुछ नहीं होता है, लेकिन KEYWORD, लाइन एंकर की शुरुआत ( ^) और लाइन एंकर के अंत ( $) को जोड़ता है। आपका regex:

VAR=whatever
{ printf '%s\n' "$VAR";cat somefile; } | sed '1{h;d;};/^KEYWORD$/g'

बहुत अच्छा लगता है अगर आपका VAR एक लाइन लंबा है। मैंने वास्तव में टिप्पणियों में उल्लेख किया है कि VAR "एक पंक्ति के बजाय 100 पृष्ठ लंबा" हो सकता है। गलतफहमी के लिए खेद है।
ताल

0

आप बैश के पैटर्न प्रतिस्थापन पैरामीटर विस्तार का उपयोग करके, अपने प्रतिस्थापन स्ट्रिंग में आगे की स्लैश से बैकस्लैश कर सकते हैं। यह थोड़ा गड़बड़ है क्योंकि आगे की स्लैश को भी बैश के लिए भागने की जरूरत है।

$ var='a/b/c';var="${var//\//\\/}";echo 'this is a test' | sed "s/i/$var/g"

उत्पादन

tha/b/cs a/b/cs a test

आप पैरामीटर विस्तार को सीधे अपने sed कमांड में रख सकते हैं :

$ var='a/b/c';echo 'this is a test' | sed "s/i/${var//\//\\/}/g"

लेकिन मुझे लगता है कि पहला रूप थोड़ा अधिक पठनीय है। और निश्चित रूप से यदि आप एक ही प्रतिस्थापन पैटर्न को कई सेड कमांड में फिर से उपयोग करने जा रहे हैं तो यह समझ में आता है कि केवल एक बार रूपांतरण करना है।

एक अन्य विकल्प यह होगा कि आप स्क्रिप्ट का उपयोग करने के बजाय awk, perl या Python या C प्रोग्राम में लिखी गई स्क्रिप्ट का उपयोग करें।


यहां पाइथन में एक सरल उदाहरण दिया गया है जो काम करता है यदि कीवर्ड को प्रतिस्थापित किया जाए तो इनपुट फ़ाइल में एक पूरी लाइन है (न्यूलाइन की गिनती नहीं)। जैसा कि आप देख सकते हैं, यह अनिवार्य रूप से आपके बैश उदाहरण के समान एल्गोरिथ्म है, लेकिन यह इनपुट फ़ाइल को अधिक कुशलता से पढ़ता है।

import sys

#Get the keyword and replacement texts from the command line
keyword, replacement = sys.argv[1:]
for line in sys.stdin:
    #Strip any trailing whitespace
    line = line.rstrip()
    if line == keyword:
        line = replacement
    print(line)

यह इनपुट को पवित्र करने का सिर्फ एक और तरीका है, और उस पर एक महान नहीं है, क्योंकि यह केवल एक विशिष्ट चरित्र ('/') को संभालता है। जैसा कि वाइल्डकार्ड ने बताया, केवल सीमांकक स्ट्रिंग की तुलना में अधिक सावधान रहना है।
ताल

निष्पक्ष आह्वान। उदाहरण के लिए, यदि रिप्लेसमेंट टेक्स्ट में कोई बैकस्लैश-एस्कैप्ड सीक्वेंस हैं, तो उनकी व्याख्या की जाएगी, जो वांछनीय नहीं हो सकता है। इसके चारों ओर एक रास्ता समस्याग्रस्त चार्ट (या पूरी चीज़) को \x-स्टाइल एस्केप सीक्वेंस में बदलना होगा । या एक प्रोग्राम का उपयोग करने के लिए जो मनमाने ढंग से इनपुट को संभाल सकता है, जैसा कि मैंने अपने आखिरी पैराग्राफ में उल्लेख किया है।
पीएम 2

@ ताल: मैं अपने उत्तर में एक साधारण पायथन उदाहरण जोड़ूंगा।
PM 2Ring

अजगर स्क्रिप्ट बहुत अच्छी तरह से काम करती है, और लगता है कि वास्तव में मेरा कार्य क्या करता है, केवल अधिक कुशलता से। दुर्भाग्य से, अगर मुख्य स्क्रिप्ट बैश है (जैसा कि मेरे मामले में है), इसके लिए एक माध्यमिक बाहरी पायथन स्क्रिप्ट के उपयोग की आवश्यकता होती है।
ताल

-1

इस तरह से मैं चला गया:

#Replaces a keyword with a long string
#
#This is normally done with sed, but sed
#tries to interpret the string you are
#replacing the keyword with too hard
#
#stdin - contents to look through
#Arg 1 - keyword to replace
#Arg 2 - what to replace keyword with
replace() {
        KEYWORD="$1"
        REPLACEMENT_STRING="$2"

        while IFS= read -r LINE
        do
                if [[ "$LINE" == "$KEYWORD" ]]
                then
                        printf "%s\n" "$REPLACEMENT_STRING"
                else
                        printf "%s\n" "$LINE"
                fi
        done < /dev/stdin
}

यह मेरे मामले में बहुत अच्छा काम करता है क्योंकि मेरा कीवर्ड अपने आप ही एक लाइन पर है। यदि कीवर्ड अन्य पाठ के अनुरूप होता है, तो यह काम नहीं करेगा।

मैं अभी भी वास्तव में जानना चाहता हूं कि क्या ऐसा करने का एक आसान तरीका है जिसमें मेरे स्वयं के समाधान को कोड करना शामिल नहीं है।


1
यदि आप वास्तव में विशेष पात्रों और मजबूती के बारे में चिंतित हैं, तो आपको बिल्कुल भी उपयोग नहीं करना चाहिए echoइसके बजाय उपयोग करें printf और शेल लूप में टेक्स्ट प्रोसेसिंग करना एक बुरा विचार है।
वाइल्डकार्ड

1
यह उपयोगी होता यदि आप इस प्रश्न में उल्लेख करते कि कीवर्ड हमेशा एक पूर्ण पंक्ति होगी। FWIW, बैश readहै बल्कि धीमी है। यह इंटरएक्टिव यूजर इनपुट प्रोसेसिंग के लिए है, टेक्स्ट फाइल प्रोसेसिंग के लिए नहीं। यह धीमा है क्योंकि यह स्टर्ड चार को चार द्वारा पढ़ता है, प्रत्येक चार्ट के लिए एक सिस्टम कॉल करता है।
पीएम 2

@PM 2Ring मेरे प्रश्न में उल्लेख नहीं किया गया है कि कीवर्ड स्वयं की एक पंक्ति पर है क्योंकि मुझे ऐसा उत्तर नहीं चाहिए जो इस तरह के सीमित मामलों में काम करता हो - मुझे कुछ ऐसा चाहिए था जो आसानी से काम कर सके जहां कोई भी कीवर्ड नहीं है था। मैंने यह भी कभी नहीं कहा कि मेरा कोड कुशल है - अगर यह होता, तो मैं एक विकल्प की तलाश में नहीं होता ...
ताल

@Wildcard जब तक मैं कुछ याद कर रहा हूं, प्रिंटफ विशेष पात्रों की व्याख्या करता है, और डिफ़ॉल्ट 'गूंज' की तुलना में कहीं अधिक है। printf "hi\n"प्रिन्ट प्रिंट को एक नई रेखा बनायेगा जबकि echo "hi\n"यह प्रिंट करता है।
ताल

@ ताल, "f" का printfअर्थ "प्रारूप" है - पहला तर्क printfएक प्रारूप निर्दिष्टकर्ता है। कि विनिर्देशक है %s\n, जिसका अर्थ है 'स्ट्रिंग न्यू लाइन के बाद ", कुछ भी नहीं अगले तर्क से व्याख्या या द्वारा अनुवाद किया जाएगा printf सब पर । (शेल अभी भी इसकी व्याख्या कर सकता है, निश्चित रूप से; सर्वश्रेष्ठ एकल उद्धरण में यह सब छड़ी अगर यह एक शाब्दिक स्ट्रिंग, या डबल उद्धरण है यदि आप चर विस्तार चाहते हैं।) अधिक विवरण के लिए मेरा जवाबprintf देखें।
वाइल्डकार्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.