คำเตือน: นี่เป็นวิธีที่อันตราย! มันละเมิดบัฟเฟอร์ i / o ใน linux และด้วยตัวเลือกเฉพาะของบัฟเฟอร์ที่จัดการเพื่อทำงานกับไฟล์ขนาดเล็ก มันเป็นความอยากรู้ที่น่าสนใจ แต่อย่าใช้มันในสถานการณ์จริง!
นอกจากนี้-i
ตัวเลือกของsed
คุณสามารถใช้ยูทิลิตี้tee
จากman
:
ที - อ่านจากอินพุตมาตรฐานและเขียนไปยังเอาต์พุตและไฟล์มาตรฐาน
ดังนั้นการแก้ปัญหาจะเป็น:
sed s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html | tee | tee index.html
- ที่นี่tee
มีการทำซ้ำเพื่อให้แน่ใจว่ามีการบัฟเฟอร์ จากนั้นคำสั่งทั้งหมดในไปป์ไลน์จะถูกบล็อกจนกว่าจะได้รับอินพุตบางส่วนเพื่อใช้งาน แต่ละคำสั่งในไปป์ไลน์เริ่มต้นเมื่อคำสั่งอัพสตรีมได้เขียน 1 บัฟเฟอร์ของไบต์ (ขนาดถูกกำหนดไว้ที่ใดที่หนึ่ง ) ไปยังอินพุตของคำสั่ง ดังนั้นคำสั่งสุดท้ายtee index.html
ที่เปิดไฟล์สำหรับการเขียนและทำให้มันว่างเปล่ามันทำงานหลังจากขั้นตอนการอัพสตรีมเสร็จสิ้นและเอาต์พุตอยู่ในบัฟเฟอร์ภายในไพพ์ไลน์
เป็นไปได้มากว่าสิ่งต่อไปนี้จะไม่ทำงาน:
sed s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html | tee index.html
- มันจะรันทั้งสองคำสั่งของไพพ์ไลน์ในเวลาเดียวกันโดยไม่มีการบล็อคใด ๆ (โดยไม่ปิดกั้นท่อควรผ่านเส้นไบต์โดยสายแทนของบัฟเฟอร์โดยบัฟเฟอร์. เช่นเดียวกับเมื่อคุณเรียกใช้cat | sed s/bar/GGG/
. โดยไม่ปิดกั้นมันโต้ตอบมากขึ้นและมักจะท่อเพียง 2 คำสั่งทำงานโดยไม่ต้องบัฟเฟอร์และการปิดกั้น. ท่ออีกต่อไปเป็น buffered.) The tee index.html
ประสงค์ เปิดไฟล์สำหรับเขียนและมันจะถูกทำให้ว่างเปล่า อย่างไรก็ตามหากคุณเปิดบัฟเฟอร์เสมอรุ่นที่สองจะทำงานเช่นกัน
perl -pi -w -e 's/STRING_TO_REPLACE/REPLACE_WITH/g;' index.html