สิ่งหนึ่งที่ควรทราบsed
ไม่สามารถเขียนไฟล์ด้วยตัวเองเป็นจุดประสงค์เพียงอย่างเดียวของ sed คือทำหน้าที่เป็นตัวแก้ไขใน "สตรีม" (เช่นไพพ์ไลน์ของ stdin, stdout, stderr และ>&n
บัฟเฟอร์อื่น ๆซ็อกเก็ตและอื่น ๆ) เมื่อคำนึงถึงสิ่งนี้คุณสามารถใช้คำสั่งอื่นtee
เพื่อเขียนเอาต์พุตกลับไปยังไฟล์ diff
อีกตัวเลือกหนึ่งคือการสร้างแพทช์จากท่อเข้าไปในเนื้อหา
วิธีตี๋
sed '/regex/' <file> | tee <file>
วิธีการแก้ไข
sed '/regex/' <file> | diff -p <file> /dev/stdin | patch
UPDATE:
นอกจากนี้โปรดทราบว่าตัวแก้ไขจะทำให้ไฟล์เปลี่ยนจากบรรทัดที่ 1 ของเอาต์พุต diff:
Patch ไม่จำเป็นต้องรู้ไฟล์ที่จะเข้าถึงเนื่องจากพบได้ในบรรทัดแรกของเอาต์พุตจาก diff:
$ echo foobar | tee fubar
$ sed 's/oo/u/' fubar | diff -p fubar /dev/stdin
*** fubar 2014-03-15 18:06:09.000000000 -0500
--- /dev/stdin 2014-03-15 18:06:41.000000000 -0500
***************
*** 1 ****
! foobar
--- 1 ----
! fubar
$ sed 's/oo/u/' fubar | diff -p fubar /dev/stdin | patch
patching file fubar
-i
เป็นตัวเลือกใน gnu sed แต่ไม่ได้อยู่ใน sed มาตรฐาน อย่างไรก็ตามมันจะสตรีมเนื้อหาไปยังไฟล์ใหม่แล้วเปลี่ยนชื่อไฟล์ดังนั้นจึงไม่ใช่สิ่งที่คุณต้องการ