ฉันมีโปรแกรมภายนอกที่สร้างไฟล์เอาต์พุต (เป็นไปได้มากถึง 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'