ฉันมีโปรแกรมภายนอกที่สร้างไฟล์เอาต์พุต (เป็นไปได้มากถึง 20K บรรทัด)
ฉันต้องการแทรกบรรทัดใหม่ระหว่างบรรทัดที่ 1 ที่มีอยู่และบรรทัดที่ 2 ฉันดู awk และ sed - ฉันใช้ liners หนึ่งตัวในแต่ละข้อพอสมควร - แต่ฉันไม่สามารถหาสวิตช์ที่ถูกต้องได้ ทำเช่นนี้.
ฉันมีโปรแกรมภายนอกที่สร้างไฟล์เอาต์พุต (เป็นไปได้มากถึง 20K บรรทัด)
ฉันต้องการแทรกบรรทัดใหม่ระหว่างบรรทัดที่ 1 ที่มีอยู่และบรรทัดที่ 2 ฉันดู awk และ sed - ฉันใช้ liners หนึ่งตัวในแต่ละข้อพอสมควร - แต่ฉันไม่สามารถหาสวิตช์ที่ถูกต้องได้ ทำเช่นนี้.
คำตอบ:
awk 'NR==1{print; print "new line"} NR!=1'
              สำหรับกรณีเฉพาะของคุณควรจะง่ายกว่านี้:
sed '1 { P ; x }' your-file
คำอธิบาย: ที่บรรทัด1ให้ทำดังต่อไปนี้
จากนั้นบรรทัด (ว่างตอนนี้) จะถูกพิมพ์อีกครั้งเป็นส่วนหนึ่งของวงจร
หากคุณต้องการเพิ่มบรรทัดใหม่แทนอักขระบรรทัดใหม่ (สิ่งที่ฉันเข้าใจในตอนแรก) จากนั้นใช้sedคำสั่งของa\(ผนวก):
sed '1 a\
appended line' your-file
หรือแม้กระทั่ง
sed '1 aappended line' your-file
มันจะต่อท้าย " appended line" หลังจากบรรทัดที่ 1
sed -i '1 a\\' fileเพียงขึ้นบรรทัดใหม่
                    '1 aapended line'ตัวอย่างที่สองของฉัน
                    ฉันคิดว่า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
sed ':a;N;$!ba;s/\n/\n\n\n/' yourBigFile
              สิ่งนี้อาจใช้ได้กับคุณ:
sed 1G file
หากคุณต้องการแทรกsomethingหลังบรรทัดใหม่:
sed '1{G;s/$/something/}' file
หรือถ้าคุณจับ\n:
sed '1s/$/\nsomething/' file
แน่นอนaง่ายยิ่งขึ้น:
sed '1a something' file
              \nต่อท้ายบรรทัดหนึ่ง!
                    ฉันมักจะใช้edสำหรับสิ่งนี้:
(echo 1a; echo 'Line to insert'; echo .; echo w) | ed - filename
คล้ายกับsedวิธีแก้ปัญหา แต่ไม่มีความยุ่งเหยิงของการขึ้นบรรทัดใหม่
echoอย่างโดยเฉพาะอย่างยิ่งภายใต้bash: ed - filename <<< $'1a\nLine to insert\n.\nw'.
                    dash /bin/sh
                    echo ” เจียดทั้งหมด echo 's ย่อมเป็นbashคุณลักษณะเพียง แต่ลดechoการนับ 4-1 ในผลงานdashและมากเกินไป:ksh echo '1a\nLine to insert\n.\nw' | ed - filename
                    printf %s\\nซึ่งจะขึ้นบรรทัดใหม่หลังจากที่ทุกอาร์กิวเมนต์ให้คุณและจะไม่ทำให้เสียอักขระพิเศษที่ฝังอยู่ในบรรทัดที่คุณต้องการแทรก นอกจากนี้ทำไมใช้edเมื่อexพร้อมใช้งาน
                    Python Solution
python -c "import sys; lines = sys.stdin.readlines(); lines.insert(1,'New Line\n'); print ''.join(lines).strip()" < input.txt
              การใช้sedและรหัส Escape ANSI (เฉพาะสำหรับ Bash):
# note: \ --> \\
printf '%s\n' 1 2 3 4 5 | sed -e $'1 { s/\\(.*\\)/\\1\\\ninserted line/; }'
              ฉันจะใช้หลามสำหรับสิ่งนี้
import fileinput
for linenum,line in enumerate(fileinput,FileInput("file",inplace=1)):
    if linenum ==1:
          print ""
          print line.rstrip() 
      else: 
          print line.rstrip()`
              ฉันชอบใช้ตัวนับชัดเจน:
awk '(c==1) {print "new line"} (c!=1) {print $0} {c++}' file
              วิธีที่ง่ายที่สุดใช้printfและex:
printf '%s\n' 1a 'my line to insert' . x | ex file
1aหมายถึง "ผนวกหลังจากบรรทัดแรก"; .ลงท้ายท้ายนั้น xหมายถึงการบันทึกและออก
ไม่มีคำตอบข้างต้นพูดถึงวิธีบันทึกการเปลี่ยนแปลงไปยังไฟล์ต้นฉบับซึ่งฉันคิดว่า 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
              
awk 'NR==2 {print "new line"} 1'