ฉันจะคัดลอกเนื้อหาของไฟล์ข้อความและวางไปยังตำแหน่งอื่นที่เริ่มต้นที่บรรทัดที่แน่นอนได้อย่างไร


13

ฉันต้องการคัดลอกเนื้อหาของไฟล์ข้อความและวางลงในไฟล์ข้อความอื่น ไฟล์ข้อความแรกมีข้อมูล 10 บรรทัดและฉันต้องการให้คัดลอกไปยังไฟล์ข้อความที่สองโดยเริ่มที่บรรทัดที่ 5 (ตัวอย่าง) ดังนั้นในไฟล์ข้อความที่สองข้อมูลเหล่านั้นควรเขียนจากบรรทัดที่ 5 ถึงบรรทัดที่ 14 สิ่งนี้สามารถทำได้? ขอบคุณล่วงหน้า. พิจารณาฉันในฐานะมือใหม่เกี่ยวกับ Linux

คำตอบ:


10

headและtailการแก้ปัญหา

สมมติแฟ้มแหล่งที่มาที่เรียกว่าไฟล์ที่จะแทรกเรียกว่า~/a ~/bเราจะใส่ไฟล์ที่ผสานเข้าไปใน~/c:

head -n 5 ~/a > ~/c
cat ~/b >> ~/c
tail --lines=+6 ~/a >> ~/c
  • พา ธ~/นั้นสั้นสำหรับ/home/userชื่อไดเรกทอรีของคุณ
  • head คัดลอกห้าบรรทัดแรกของไฟล์aลงในไฟล์ที่สร้างขึ้นใหม่c
  • cat แสดงรายการเนื้อหาของไฟล์bและต่อท้ายไฟล์c
  • tail ต่อท้ายไฟล์aเริ่มต้นที่บรรทัด 6 จนกระทั่งจบไฟล์c

หลังจากยืนยันการเปลี่ยนชื่อไฟล์ที่ผสานแล้ว

หลังจากตรวจสอบว่าไฟล์cถูกผสานอย่างถูกต้องจากไฟล์aและbเราจะเปลี่ยนชื่อcเป็นaใช้:

mv ~/c ~/a
  • mvย้ายไฟล์ลงในแฟ้มc aข้อมูลไม่ได้ถูกย้าย ไฟล์ถูกเปลี่ยนชื่อเพียงซึ่งช่วยประหยัดเวลา

ขอบคุณสำหรับคำตอบ. มันใช้งานได้ดี อย่างไรก็ตามมีวิธีอื่นในการทำเช่นนี้โดยไม่ใช้ไฟล์ข้อความที่สามใช่หรือไม่
G. Paschalis

ไฟล์ที่สามสามารถเปลี่ยนชื่อเป็นไฟล์ต้นฉบับได้เมื่อเสร็จแล้ว ฉันคิดว่ามันจะดีที่สุดที่จะสามารถดูไฟล์ก่อน ฉันจะเพิ่มขั้นตอนพิเศษในคำตอบทันที
WinEunuuchs2Unix

หรือ ...(head -n 5 a.txt ; cat b.txt ; tail -n +6 a.txt) > c.txt

1
@JJoao นั่นคือการสรุปหนึ่งบรรทัดที่ดี :) สำหรับจุดประสงค์ในการสอนฉันต้องการใช้หนึ่งบรรทัดต่อวิธีคำสั่งและซ้อนกันถ้ามีคำสั่ง อย่างไรก็ตามสำหรับการคัดลอกและวางลงในเทอร์มินัลฉันรักหนึ่ง liners!
WinEunuuchs2Unix

16

sedเครื่องมือที่ง่ายที่สุดที่นี่อาจจะเป็น ที่จะแทรกb.txtเข้าไปในa.txtหลังจากที่สาย 5, คุณสามารถเขียน:

sed '5r b.txt' a.txt

sedอ่านไฟล์ที่ระบุเป็นอาร์กิวเมนต์ ( a.txt) ทีละบรรทัด บรรทัดทั้งหมดได้รับการทำซ้ำในผลลัพธ์เช่นเดียวกับที่ปรากฏในอินพุตเว้นแต่ว่าพวกเขาจะได้รับการแก้ไขโดยคำสั่ง

นี่5คือที่อยู่ (หมายเลขบรรทัด) ซึ่งคำสั่งต่อไปนี้จะต้องถูกดำเนินการ คำสั่งที่เราใช้คือrซึ่งใช้ชื่อไฟล์เป็นอาร์กิวเมนต์ (ที่นี่b.txt) อ่านอย่างสมบูรณ์และแทรกลงในเอาต์พุตหลังจากบรรทัดปัจจุบัน

sedบรรทัดคำสั่งนี้จะพิมพ์เอาต์พุตไปยังเทอร์มินัลเท่านั้นโดยไม่ต้องเขียนลงไฟล์ใด ๆ คุณสามารถเปลี่ยนเส้นทางไปยังไฟล์ใหม่ (ไม่ใช่ไฟล์อินพุตใด ๆ !) โดยใช้การเปลี่ยนเส้นทางของ Bash:

sed '5r b.txt' a.txt > c.txt

หรือคุณโดยตรงสามารถปรับเปลี่ยนแฟ้มใส่ด้านนอกa.txtโดยใช้sed's -i(สำหรับ 'ในสถานที่') สวิทช์ หากคุณเขียนมัน-i.bakจะทำสำเนาสำรองของไฟล์อินพุตดั้งเดิมด้วยคำต่อท้าย.bakก่อน:

sed -i '5r b.txt' a.txt

ตัวอย่าง:

$ cat a.txt 
January
February
March
April
May
October
November
December

$ cat b.txt 
June
July
August
September

$ sed '5r b.txt' a.txt
January
February
March
April
May
June
July
August
September
October
November
December

0

(การนำตัวอย่างที่สวยงามกลับมาใช้ใหม่จาก @ByteCommander :)

awk '1; NR==5 {system("cat b.txt")}' a.txt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.