ฉันจะเขียนไปยังบรรทัดที่สองของไฟล์จากบรรทัดคำสั่งได้อย่างไร


29

ฉันมีโปรแกรมภายนอกที่สร้างไฟล์เอาต์พุต (เป็นไปได้มากถึง 20K บรรทัด)

ฉันต้องการแทรกบรรทัดใหม่ระหว่างบรรทัดที่ 1 ที่มีอยู่และบรรทัดที่ 2 ฉันดู awk และ sed - ฉันใช้ liners หนึ่งตัวในแต่ละข้อพอสมควร - แต่ฉันไม่สามารถหาสวิตช์ที่ถูกต้องได้ ทำเช่นนี้.

คำตอบ:


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

12
สั้นกว่าเล็กน้อย:awk 'NR==2 {print "new line"} 1'
เกล็

@glennjackman: เวอร์ชันของคุณใช้งานไม่ได้กับระบบของฉัน แต่คำตอบก็ใช้ได้ โดยเฉพาะกับคุณบรรทัดที่ 2 จะทำซ้ำและบรรทัดใหม่จะถูกแทรกระหว่างทั้งคู่ (เช่นเดียวกับบรรทัดที่ 3)
Nikana Reklawyks

มีวิธีเริ่มเขียนที่บรรทัดที่ 2 และเขียนทับบรรทัดถัดไปทั้งหมดหรือไม่
CMCDragonkai

@CMCDragonkai ฉันไม่แน่ใจว่าสิ่งที่คุณขอ เพียงพิมพ์บรรทัดแรกของไฟล์ที่ระบุและบรรทัดที่สองที่ตั้งไว้? บรรทัดแรกแล้วเนื้อหาของไฟล์? บรรทัดแรกของไฟล์แรกจากนั้นบรรทัดจากไฟล์ที่สองสำหรับแต่ละบรรทัดที่เหลือในบรรทัดแรก? คุณอาจต้องการถามคำถามใหม่พร้อมคำอธิบายที่เฉพาะเจาะจงเกี่ยวกับสิ่งที่คุณต้องการและตัวอย่างที่ค่อนข้างสั้น แต่สมบูรณ์
Kevin

16

สำหรับกรณีเฉพาะของคุณควรจะง่ายกว่านี้:

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

คำอธิบาย: ที่บรรทัด1ให้ทำดังต่อไปนี้

  1. P rint เส้น
  2. E xเปลี่ยนพื้นที่รูปแบบด้วยพื้นที่ว่าง (โดยพื้นฐานแล้วลบบัฟเฟอร์)

จากนั้นบรรทัด (ว่างตอนนี้) จะถูกพิมพ์อีกครั้งเป็นส่วนหนึ่งของวงจร


หากคุณต้องการเพิ่มบรรทัดใหม่แทนอักขระบรรทัดใหม่ (สิ่งที่ฉันเข้าใจในตอนแรก) จากนั้นใช้sedคำสั่งของa\(ผนวก):

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

หรือถ้าคุณจับ\n:

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

แน่นอนaง่ายยิ่งขึ้น:

sed '1a something' file

ฉันขอโทษมันทำอะไร?
Nikhil Mulley

มันแทรกขึ้นบรรทัดใหม่หลังจากบรรทัดที่ 1
potong

1
หรือเพิ่มการขึ้นบรรทัดใหม่\nต่อท้ายบรรทัดหนึ่ง!
potong

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'.
จัดการ

1
ไม่ทำงานในเปลือกหอยทั้งหมดเช่นในซึ่งในระบบเป็นจำนวนมากdash /bin/sh
Arcege

1
นั่นคือเหตุผลที่ฉันเขียน“ คุณสามารถสำรองบางส่วน echo ” เจียดทั้งหมด echo 's ย่อมเป็นbashคุณลักษณะเพียง แต่ลดechoการนับ 4-1 ในผลงานdashและมากเกินไป:ksh echo '1a\nLine to insert\n.\nw' | ed - filename
จัดการ

1
หรือเพียงแค่ใช้printf %s\\nซึ่งจะขึ้นบรรทัดใหม่หลังจากที่ทุกอาร์กิวเมนต์ให้คุณและจะไม่ทำให้เสียอักขระพิเศษที่ฝังอยู่ในบรรทัดที่คุณต้องการแทรก นอกจากนี้ทำไมใช้edเมื่อexพร้อมใช้งาน
Wildcard



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

ไม่มีคำตอบข้างต้นพูดถึงวิธีบันทึกการเปลี่ยนแปลงไปยังไฟล์ต้นฉบับซึ่งฉันคิดว่า OP ต้องการอะไร

แน่นอนสิ่งที่ฉันต้องการเมื่อฉันไปที่หน้าเว็บ

ดังนั้นสมมติว่าไฟล์ของคุณถูกเรียก output.txt

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

กรณีการใช้งานเฉพาะของฉันคือการเพิ่มการประกาศสไตล์ชีท xsl ให้กับไฟล์ junit xml โดยอัตโนมัติ

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

yourownlinux.com/2015/04/…เป็นส่วนที่เกี่ยวข้องของคำแนะนำที่เป็นลายลักษณ์อักษรอย่างดีเกี่ยวกับ sed
chim
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.