मैं कमांड लाइन से किसी फ़ाइल की दूसरी पंक्ति कैसे लिख सकता हूं?


29

मेरे पास एक बाहरी प्रोग्राम है जो आउटपुट फ़ाइल (लार्जिश, 20K लाइन्स संभव) का उत्पादन करता है।

मुझे मौजूदा लाइन 1 और लाइन 2 के बीच एक नई लाइन सम्मिलित करने की आवश्यकता है। मैं awk और sed देख रहा हूं - मैं प्रत्येक नियमित रूप से एक लाइनर का उपयोग करता हूं - लेकिन मैं सही स्विच के साथ नहीं आ पाया हूं यह करो।

जवाबों:


20
awk 'NR==1{print; print "new line"} NR!=1'

12
थोड़ा छोटा:awk 'NR==2 {print "new line"} 1'
ग्लेन जैकमैन

@glennjackman: आपका संस्करण मेरे सिस्टम पर काम नहीं करता है, लेकिन उत्तर देता है। विशेष रूप से, आपके साथ, पंक्ति 2 को डुप्लिकेट किया गया है और दोनों के बीच नई रेखा डाली गई है (इसलिए पंक्ति 3)।
निकाना रेक्लाविक्स

क्या दूसरी पंक्ति में लिखना शुरू करना है और बाद की सभी पंक्तियों को लिखना है?
CMCDragonkai

@CMCDragonkai मैं निश्चित नहीं हूं कि आप क्या पूछ रहे हैं। बस निर्दिष्ट फ़ाइल की पहली पंक्ति और एक सेट दूसरी पंक्ति प्रिंट करें? पहली पंक्ति और फिर एक फ़ाइल की सामग्री? पहली फ़ाइल की पहली पंक्ति और फिर पहली में शेष प्रत्येक पंक्ति के लिए दूसरी फ़ाइल से एक पंक्ति? आप एक नया प्रश्न पूछना चाहते हैं कि आप क्या चाहते हैं, और एक अपेक्षाकृत संक्षिप्त लेकिन पूर्ण उदाहरण।
केविन

16

आपके विशिष्ट मामले के लिए, यह सरल होना चाहिए:

sed '1 { P ; x }' your-file

स्पष्टीकरण: पंक्ति 1 पर , निम्न कार्य करें

  1. P लाइन को रिंट करता है
  2. x होल्डिंग स्पेस के साथ पैटर्न स्पेस को बदलना (मूल रूप से बफर को खाली करता है)

फिर, लाइन (खाली अब) को चक्र के भाग के रूप में फिर से मुद्रित किया जाता है।


यदि आप एक नई पंक्ति वर्ण के बजाय एक नई पंक्ति जोड़ना चाहते हैं (जो मैंने शुरू में समझी थी) तो बस कमांड (एपेंड) का उपयोग करें:seda\

sed '1 a\
appended line' your-file

या और भी

sed '1 aappended line' your-file

यह appended lineपंक्ति 1 के बाद " " जोड़ता है ।


1
sed -i '1 a\\' fileसिर्फ एक नई पंक्ति के लिए।
forcefsck

1
@forcefsck हां, केवल नुकसान यह है कि यह एक GNUism है, मेरे दूसरे '1 aapended line'उदाहरण के रूप में।
angus

8

मुझे लगता है कि sedदृष्टिकोण होगा:

sed '2 i whatever_line_of_text_you_wanted_to_INSERT' filename.txt

इससे टेक्स्ट को फाइल की दूसरी लाइन में मिल जाएगा और फिर फाइल के साथ वास्तविक दूसरी लाइन तीसरी हो जाएगी।

ध्यान दें कि, एपेंड मोड का उपयोग करते हुए , अगर यह होना था, तो इसे पहली पंक्ति का उपयोग करना था, क्योंकि लाइन के नोट किए जाने के बाद एपेंड होगा।

sed '1 a whatever_line_of_text_you_wanted_to_INSERT' filename.txt



2

यह आपके लिए काम कर सकता है:

sed 1G file

यदि आप somethingन्यूलाइन के बाद सम्मिलित करना चाहते हैं :

sed '1{G;s/$/something/}' file

या यदि आप sed संभालते हैं \n:

sed '1s/$/\nsomething/' file

बेशक aऔर भी आसान है:

sed '1a something' file

मुझे क्षमा करें, यह क्या करता है?
निखिल मुल्ले


1
या बल्कि एक लाइन के \nलिए एक नई लाइन जोड़ता है !
पोट

1

मैं आमतौर पर इसके लिए उपयोग करता हूं ed:

(echo 1a; echo 'Line to insert'; echo .; echo w) | ed - filename

एक sedसमाधान के समान है , लेकिन बिना बच निकले नए सिरे से।


2
आप कुछ अतिरिक्त सकता echoहै, विशेष रूप से के तहत bash: ed - filename <<< $'1a\nLine to insert\n.\nw'
16

1
उदाहरण के लिए dash, जो कई प्रणालियों पर है, सभी गोले में काम नहीं करता है /bin/sh
Arcege

1
यही कारण है कि मैंने लिखा है "आप कुछ अतिरिक्त कर सकते हैं echo"। सभी को बख्शना echoवास्तव में bashकेवल विशेषता है, लेकिन echoगिनती को 4 से 1 तक कम करना dashऔर इसमें kshभी echo '1a\nLine to insert\n.\nw' | ed - filename:।
manatwork

1
या बस उपयोग करेंprintf %s\\n , जो आपके द्वारा दिए गए प्रत्येक आर्ग के बाद एक नई पंक्ति डालता है और उस पंक्ति में एम्बेडेड विशेष वर्णों पर पेंच नहीं करता है जिन्हें आप सम्मिलित करना चाहते हैं। इसके अलावा, उपलब्ध edहोने पर उपयोग क्यों करें ex?
वाइल्डकार्ड 1


0

उपयोग sedऔर (बाश-विशिष्ट) ANSI भागने कोड:

# note: \ --> \\
printf '%s\n' 1 2 3 4 5 | sed -e $'1 { s/\\(.*\\)/\\1\\\ninserted line/; }'

0

मैं इसके लिए अजगर का उपयोग करूंगा

import fileinput

for linenum,line in enumerate(fileinput,FileInput("file",inplace=1)):
    if linenum ==1:
          print ""
          print line.rstrip() 
      else: 
          print line.rstrip()`


0

सरलतम विधि का उपयोग करता है printfऔर ex:

printf '%s\n' 1a 'my line to insert' . x | ex file

1a"पहली पंक्ति के बाद परिशिष्ट"; .एपिंग को समाप्त करता है; xमतलब बचाओ और बाहर निकल जाओ।


0

उपरोक्त उत्तरों में से कोई भी मूल फ़ाइल में परिवर्तनों को सहेजने का उल्लेख नहीं करता है, जो मुझे लगता है कि ओपी क्या पूछ रहा था।

जब मैं पेज पर कैम करता हूं तो यह निश्चित रूप से मेरी जरूरत होती है।

तो यह मानते हुए कि आपकी फ़ाइल कहा जाता है output.txt

sed -i '1 a This is the second line' output.txt

मेरा विशेष उपयोग मामला एक जूनियर xml फ़ाइल में xsl स्टाइलशीट घोषणा को स्वचालित रूप से जोड़ना है।

sed -i '1 a <?xml-stylesheet type="text/xsl" href="junit-html.xsl"?>' junit.xml

yourownlinux.com/2015/04/… सेड के लिए एक अच्छी तरह से लिखित परिचय का प्रासंगिक हिस्सा है।
चिम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.