किसी फ़ाइल की पहली पंक्ति से पहले टेक्स्ट कैसे डालें?


76

मैं sedएक विशिष्ट पंक्ति में फ़ाइल में पाठ जोड़ने के लिए कमांड के आसपास देख रहा हूं । यह पंक्ति 1 के बाद पाठ जोड़ने का काम करता है:

sed '1 a\

लेकिन मैं इसे पंक्ति 1 से पहले जोड़ना चाहता हूं । यह होगा:

sed '0 a\

लेकिन मैं इस त्रुटि मिलती है: invalid usage of line address 0

कोई उपाय?


जवाबों:


101

उपयोग sedके डालने ( i) विकल्प जो पिछले पंक्ति में पाठ डाल देंगे।

sed '1 i\

प्रश्न लेखक का अद्यतन:

जीएनयू के साथ इसे फाइल को संपादित करने के लिए sed- मुझे -iविकल्प जोड़ना था :

sed -i '1 i\anything' file

इसके अलावा वाक्य रचना

sed  -i '1i text' filename

गैर-जीएनयू सेड के लिए

आपको बैकस्लैश के तुरंत बाद 1i\और उसके बाद रिटर्न कुंजी को हिट करना होगा first_line_text:

sed -i '1i\
first_line_text
'

यह भी ध्यान दें कि कुछ गैर-जीएनयू sedकार्यान्वयन (उदाहरण के लिए मैकओएस पर) को ध्वज के लिए एक तर्क की आवश्यकता होती है-i ( -i ''जीएनयू के समान प्रभाव प्राप्त करने के लिए उपयोग sed)।


1
यह -iविकल्प के बिना काम नहीं करता है । मैं आपके उत्तर को स्वीकार करने से पहले अपडेट करूंगा।
मानोलो

1
धन्यवाद। आप कौन सा ओएस उपयोग कर रहे हैं? मूल समाधान 9. OpenSuse पर काम किया
suspectus

1
दिलचस्प! मैं ल्यूबंटू 13.10 पर हूं और sed '1 i\this text is entered above the existing first line' fileमेरे लिए काम करता है।

2
यहाँ, sed (GNU sed) 4.2.2सिर्फ sed '1 i text to insert' -i fileएक आकर्षण की तरह काम किया। धन्यवाद
टन

1
@FeRD awkनीचे मेरे खराब रैंक वाले उत्तर को देखें। यह काम करना चाहिए।
रुडाइमियर

18

पाठ प्राप्त करने के लिए इको का उपयोग किया जाता है। बिल्ली फ़ाइल नाम - कंसोल में फ़ाइल प्रिंट करता है और> इसका उपयोग दूसरी फ़ाइल फ़ाइलनाम 1 को भेजने के लिए करता है और फिर हम वांछित फ़ाइल की पहली पंक्ति में पाठ सम्मिलित करने के लिए फ़ाइल नाम 1 पर स्थानांतरित करते हैं।

  (echo "some text" && cat filename) > filename1 && mv filename1 filename

7
कृपया मुझे बताएं कि निम्न को क्यों हटाया गया है
अंकित शाह

1
शायद इसलिए कि ओपी ने सेड का उल्लेख किया है। यह मेरी राय में एक डाउन वोट के लायक नहीं है। यह समाधान मेरी जरूरतों के हिसाब से सबसे अच्छा था, फिर उसे उकेरा गया।
рüффп

मैंने उत्थान किया। मेरे लिए ksh पर काम करता है।
arcee123

15

आप पूर्व मोड में विम का उपयोग कर सकते हैं:

ex -sc '1i|ALFA BRAVO' -cx file
  1. 1 पहली पंक्ति का चयन करें

  2. i टेक्स्ट और न्यूलाइन डालें

  3. x सहेजें और बंद करें


7

आप पाठ को पहली पंक्ति से पहले सम्मिलित करना चाहते हैं बजाय इसे जोड़ने के, इसलिए उपयोग करें

sed '1 i\
your_text' your_file

यहां एक दस्तावेज़ भी मदद कर सकता है:

cat /dev/stdin your_file <<EOI
Your text
goes here
EOI

6

GNU awk> = 4.1 का उपयोग करना:

awk -i inplace 'BEGINFILE{print "first line"}{print}' foo.sh

सभी sedउत्तरों के विपरीत , यह खाली फाइलों पर भी काम करता है।


inplaceएक पुस्तकालय है, और दुर्भाग्य से यह सभी awk वितरण पर दिखाई देता है इसे जहाज। मुझे "जाग: घातक: पढ़ने के लिए स्रोत फ़ाइल 'नहीं खोल सकता"GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.1, GNU MP 6.1.2)
vossad01

6
sed  -i '1i new_text' file_name

यदि आप -iविकल्प निर्दिष्ट नहीं करते हैं , तो यह कोई त्रुटि नहीं दिखाएगा, और मानक टर्मिनल पर आउटपुट प्रदर्शित करता है, लेकिन फ़ाइल में पाठ सम्मिलित नहीं करता है।


सवाल -iस्विच के बारे में नहीं है ।
don_crissti

आप उसका अनुमान कैसे लगाते हैं? यह है प्रश्न का उत्तर। हां, यह स्वीकृत उत्तर के समान है, लेकिन बिल्कुल समान नहीं है।
जी-मैन

@ जी-मैन - एक cas द्वारा उपयोग किए गए खाके है अब तक आदर्श से, लेकिन वास्तव में तर्क कर सकता है, यह है समान की तरह में लगभग समान ... अंतर रिक्ति और तथ्य यह है कि यह एक नहीं बैकस्लैश है किया जा रहा है। जहां तक ​​मेरा सवाल है कि वे तकनीकी रूप से समान हैं (जैसा कि वे दोनों gnu sedविशिष्ट हैं और यह सिर्फ ऐसा होता है जो बिना बैकलैश के gnu sedस्वीकार करेंगे i)। अगर दूसरों को लगता है कि यह एक अलग जवाब + एक उत्थान ... ओह ठीक है।
don_crissti

1

आपके द्वारा किया गया 0aआदेश कार्य करता है ex, पूर्ववर्ती कोvi :

printf '%s\n' 0a 'Anything you want to add' . x | ex file.txt

printfअपने आप में आदेश आउटपुट:

0a
Anything you want to add
.
x

0aसाधन 0 पंक्ति के बाद (यानी पहली पंक्ति से पहले) जोड़ देते हैं।

अगली पंक्ति या कई पंक्तियों को जोड़ा जाना शाब्दिक पाठ है।

.पर अपने आप में एक लाइन "जोड़ना" कमांड समाप्त हो जाता है।

xकारणों में पूर्व फ़ाइल और बाहर निकलने के लिए परिवर्तन सहेजने के लिए।


1

मुझे आश्चर्य है कि इस पुराने प्रश्न में किसी ने सबसे आम नहीं दिखाया है (और इस मामले में काफी सरल) sed कमांड:

$ sed  -i '1s/^/new_text\
/' file_name

जो अधिकांश गोले में काम करता है और कई सेड संस्करण के लिए पोर्टेबल है।
यदि GNU sed उपलब्ध है, तो आप इसका उपयोग कर सकते हैं:

$ sed -i '1s/^/new_text\n' file_name

अंतर यह है कि GNU sed \nएक न्यूलाइन के लिए उपयोग की अनुमति देता है और अन्य को बैकस्लैश से पहले एक शाब्दिक न्यूलाइन की आवश्यकता होती है (जो कि वैसे भी GNU सेड में काम करते हैं)।

यदि एक शेल जो $'…'वाक्यविन्यास स्वीकार करता है उपयोग में है, तो आप सीधे नई पंक्ति सम्मिलित कर सकते हैं, इसलिए sed यह देखता है कि newline पहले से ही है:

$ sed -i $'1s/^/new_text\\\n/' file_name

जो अधिक सेड संस्करण के लिए काम करता है।


-1

दुर्भाग्य से, ऊपर दिए गए सभी उत्तर (ज्यादातर के साथ sed) मेरे लिए काम नहीं करते थे क्योंकि वे सभी पहली पंक्ति को प्रतिस्थापित करते थे। मैं एक Ubuntu 16.04 LTSमशीन पर हूं । यहाँ मेरा वर्कअराउंड है GNU Awk 4.0.2:

awk '{if(NR==1){$0="NEW_FIRST_LINE"$0; print $0} ;if(NR!=1){print $0}}' file_name

1
सुनिश्चित नहीं हैं कि आप किस बारे में बात कर रहे हैं ... केवल एक ही sedउत्तर है जो प्रतिस्थापन का उपयोग करता है लेकिन यह मौजूदा लाइन को प्रतिस्थापित नहीं करता है।
18_
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.