ฉันสามารถคิดวิธีการนี้ได้สองวิธี
วิธีแรกถือว่าคุณเป็นเจ้าของไฟล์ แต่ไฟล์นั้นพร้อมใช้งาน
เพียงใช้เครื่องหมายอัศเจรีย์ของ vi ต่อท้ายคำสั่ง write (: w!) เพื่อบังคับให้เขียนทับไฟล์ READONLY ของคุณเอง แน่นอนว่าคุณได้รับอนุญาตให้เขียนและดำเนินการในโฟลเดอร์ปัจจุบัน
:w!
จะทำให้ vi เขียนทับไฟล์ READONLY ดั้งเดิม
วิธีที่สองถือว่าคนอื่นเป็นเจ้าของไฟล์และคุณต้องการบันทึกการเปลี่ยนแปลงของคุณในไฟล์นั้น
วิธีหนึ่งในการทำสิ่งนี้ให้สำเร็จคือบันทึกการเปลี่ยนแปลงที่ทำไว้กับไฟล์ต้นฉบับเป็นสคริปต์ ed จากภายใน vi สคริปต์ ed นี้อาจนำไปใช้กับไฟล์ต้นฉบับ (หรือไฟล์ที่คล้ายกันอื่น ๆ ) ในเวลาต่อมานอกเหนือจาก vi ด้วย ed line editor
วิธีบันทึกเซสชันแก้ไขปัจจุบันเป็นสคริปต์ ed คือการส่งชื่อไฟล์ต้นฉบับและบัฟเฟอร์ vi ที่แก้ไขแล้วเป็นอินพุตมาตรฐานไปยังยูทิลิตี diff ด้วยสวิตช์บรรทัดคำสั่ง --ed เช่นแสดงความแตกต่างเป็นสคริปต์ ed
ดังนั้นสมมติว่าบัฟเฟอร์ vi ที่แก้ไขแล้วดำเนินการดังต่อไปนี้
:.,$!diff --ed [original_file] -
สิ่งนี้จะแทนที่ทุกบรรทัดในบัฟเฟอร์ปัจจุบัน (., $!) ด้วยสคริปต์ที่สร้างโดย diff (diff - ed [original_file] -) ที่จำเป็นในการแปลงไฟล์ต้นฉบับเป็นเนื้อหาของบัฟเฟอร์ปัจจุบัน จากนั้นเราต้องการบันทึกสคริปต์ ed นี้ไว้ในที่ปลอดภัยและใช้สคริปต์กับไฟล์ต้นฉบับที่เราสามารถเขียนได้ ดังนั้นให้บันทึกสคริปต์ไปยังตำแหน่งที่สามารถเขียนได้เช่นโฟลเดอร์ล็อกอินของคุณ:
:w ~/my_ed_script
ตอนนี้ออกจาก vi และใช้สคริปต์ ed นี้เพื่อรับไฟล์ที่แก้ไขซึ่งไม่สามารถบันทึกได้ตั้งแต่แรก นี่คือวิธีการทำให้สำเร็จจากพรอมต์บรรทัดคำสั่ง bash, '$':
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
สิ่งที่ลำดับคำสั่งนี้ทำในคำพูดคือการทำให้สคริปต์ที่เราสร้างขึ้นมีความต่างและสะท้อนคำสั่ง ed write, 'w' ไปยังอินพุตมาตรฐานของ ed จากนั้น Ed จะใช้สคริปต์นี้กับสำเนาที่สามารถเขียนได้ของไฟล์ต้นฉบับและเขียนการเปลี่ยนแปลงบัฟเฟอร์ที่แก้ไขแล้วเหล่านั้นกลับไปที่ไฟล์
ดังนั้นนี่คือวิธีบันทึกงานที่ทำใน vi ไปยังไฟล์ซึ่ง แต่เดิมเคยเป็นของคนอื่นที่ใช้ vi, diff และ ed