इको कमांड और पुनर्निर्देशन ऑपरेटर का उपयोग करके एक फ़ाइल में एक नया विशेष वर्ण कैसे डालें?


29

मैं इको कमांड और पुनर्निर्देशन ऑपरेटर का उपयोग करके एक फ़ाइल बनाना चाहता हूं, फ़ाइल को कुछ लाइनों से बना होना चाहिए।

मैंने स्ट्रिंग के अंदर "\ n" द्वारा एक नई रेखा शामिल करने की कोशिश की:

echo "first line\nsecond line\nthirdline\n" > foo

लेकिन इस तरह तीन पंक्तियों वाली कोई फ़ाइल नहीं बनाई गई है, लेकिन केवल एक पंक्ति और स्ट्रिंग की शब्दशः सामग्री के साथ एक फ़ाइल।

मैं केवल इस आदेश का उपयोग करके कई पंक्तियों वाली फ़ाइल कैसे बना सकता हूँ?


जवाबों:


30

आपने echoकमांड के साथ कुछ सिंटैक्स का उपयोग करने के लिए कहा :

echo $'first line\nsecond line\nthirdline' > foo

(लेकिन आपको जो अन्य उत्तर मिला है, उस पर भी विचार करें।)

$'...'निर्माण फैलता एम्बेडेड एएनएसआई भागने दृश्यों।


1
ध्यान दें कि यह POSIX नहीं है, चाहे यह उपलब्ध हो, काफी हद तक इस बात पर निर्भर करता है कि आप किस शेल का उपयोग कर रहे हैं।
क्रिस डाउन

1
आप पाते हैं कि प्रमुख गोले (कम से कम), ksh, bash, zsh (और शायद अन्य) में निर्माण होता है।
Janis

1
@ क्रिसडाउन, यह अभी तक POSIX नहीं है, लेकिन इश्यू 8 में शामिल किए जाने के लिए निर्धारित है। ksh93, bash, zsh, mksh, FreeBSD sh इसे सपोर्ट करते हैं।
स्टीफन चेजलस

24

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

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

echo -en 'first line\nsecond line\nthird line\n' > file

हालाँकि, यह वास्तव में ऐसा लगता है जैसे आप चाहते हैं printf, जो मेरी आँख के लिए अधिक उपयुक्त है, और अधिक पोर्टेबल भी है (इसमें POSIX द्वारा परिभाषित यह सुविधा है):

printf '%s\n' 'first line' 'second line' 'third line' > file

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

cat > file << 'EOF'
first line
second line
third line
EOF

मैंने आपकी बिल्ली की कोशिश की> फ़ाइल << शेल में 'EOF', जब मैं हिट करता हूं, तो मुझे यह> प्रत्येक पंक्ति के साथ आकार का संकेत मिलता है, लेकिन मैं ctrl + x या ctrl + z
अब्दुल अल हज़्रेड

आपको EOF को एक इनपुट लाइन में अकेले टाइप करना है ...
Rmano

2
@mikeserv आप मुखर या गंभीर हो रहे हैं?
मैथ्यू पढ़ें

1
@AbdulAlHazred उत्तर में लिंक के रूप में इंगित करता है, यह एक "यहाँ दस्तावेज़" कहा जाता है और बहुत आम है। विकिपीडिया इस विषय पर अच्छा है: en.wikipedia.org/wiki/Here_document
dave_thompson_085

1
यह मेरे मैक OSX (विशेष रूप से echo -en 'text..', के लिए काम किया , जबकि स्वीकार किए जाते हैं जवाब मेरे newline चरित्र ( \n), echo -enकिया पहचान नहीं किया था।
बेंजामिनोग्रामस

4

echoकमांड का उपयोग करके मल्टी-लाइन फ़ाइल बनाने के कुछ अन्य तरीके इस प्रकार हैं :

echo "first line"  >  foo
echo "second line" >> foo
echo "third line"  >> foo

जहाँ दूसरी और तीसरी कमांड >>पुनर्निर्देशन ऑपरेटर का उपयोग करती हैं , जिसके कारण कमांड का आउटपुट फ़ाइल में जोड़ा जाता है (जो पहले से मौजूद होना चाहिए, इस बिंदु तक)।

या

(echo "first line"; echo "second line"; echo "third line") > foo

जहाँ कोष्ठक echoआदेशों को एक उप-प्रक्रिया में समूहित करता है, जो किसी भी एकल कार्यक्रम की तरह दिखता है और कार्य करता है जो कई लाइनों ( lsउदाहरण के लिए) को आउटपुट करता है ।

उपरोक्त पर एक सूक्ष्म भिन्नता है

{ echo "first line"; echo "second line"; echo "third line";} > foo

यह दूसरे उत्तर की तुलना में थोड़ा अधिक कुशल है कि यह एक उप-प्रक्रिया नहीं बनाता है। हालाँकि, वाक्यविन्यास थोड़ा पेचीदा है: ध्यान दें कि आपके पास {और उससे पहले अर्धविराम के बाद एक स्थान होना चाहिए }

देखें कि शेल के नियंत्रण और पुनर्निर्देशन ऑपरेटर क्या हैं? अधिक जानकारी के लिए।


2

अभी तक एक और विकल्प देने के लिए, आप बस हिट कर सकते हैं Enter (यानी, एक शाब्दिक नई रूपरेखा):

$ echo "the rain in spain
> falls mainly on the plain" > foo

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


0

POSIX 7 कहता है कि आप नहीं कर सकते

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

-e परिभाषित नहीं है और बैकस्लैश लागू किए गए परिभाषित हैं:

यदि पहला ऑपरेंड -n है, या यदि किसी ऑपरेंड में कोई <बैकस्लैश> वर्ण है, तो परिणाम कार्यान्वयन-परिभाषित होते हैं।

जब तक आपके पास वैकल्पिक XSI एक्सटेंशन नहीं है।

इसलिए printfइसके बजाय उपयोग करें :

प्रारूप ऑपरेंड XBD फ़ाइल स्वरूप संकेतन में वर्णित प्रारूप स्ट्रिंग के रूप में उपयोग किया जाएगा [...]

फ़ाइल स्वरूप संकेतन :

\ n <newline> अगली पंक्ति के प्रारंभ में मुद्रण स्थिति को ले जाएं।

यह भी ध्यान रखें कि Ubuntu 15.10 और सबसे distros echoदोनों के रूप में लागू :

  • एक बैश में निर्मित: help echo
  • एक स्टैंडअलोन निष्पादन योग्य: which echo

जिसके कारण कुछ भ्रम हो सकता है।


echoसिस्टम पर उपलब्ध हर शेल में एक बिलिन होगा । उबंटू / बिन / श पर आमतौर पर पानी का छींटा होता है, बश भी डिफ़ॉल्ट रूप से आता है। zsh, rc, mksh, yash, csh, tsh, ksh93 ... सभी के अपने अलग-अलग व्यवहार के साथ अपनी प्रतिध्वनि होगी। ध्यान दें कि which echoआपको सभी गोले में सिस्टम की गूंज का रास्ता नहीं दिया जाएगा।
स्टीफन चेज़लस

@ StéphaneChazelas "जो गूंज आपको सभी गोले में सिस्टम गूंज का रास्ता नहीं देगा।" मुझे नहीं पता था कि यह और क्या दे सकता है?
सिरो सेंटिल्ली 新疆 改造 iro i 事件 '

Tsh या zsh में प्रयास करें। whichमूल रूप से (80 के दशक में) केवल csh उपयोगकर्ताओं के लिए एक csh स्क्रिप्ट थी (~ /। cshrc से उपनामों को लोड किया गया) और अभी भी कुछ प्रणालियों पर है। whichzsh और tsh में एक बिलिन है।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.